太久没写爬虫了,手生到连xpath怎么提取出来都忘记了,requests取回的数据编码都忘记怎么转换了
于是乎在百度上随便搜了一个情话网,来进行爬取。
目标地址:https://www.qinghuawang.net/
一如既往的习惯,打开网站后F12,看是不是ajax请求
也是,看着就很老的一个网站怎么会用ajax呢,想多了。
于是就用原始的Xpath咯。
打开浏览器里面的xpath helper
按住shift键,去选择文章标题
这样就获取到了一条标题的内容,然后就是稍微修改修改xpath,从原始的
/html/body[@class='listBody']/div[@class='bodyMain']/div[@class='bodyMainBody']/div[@class='infoList']/ul[@class='infoListUL mt5']/li[1]/a[@class='articleTitle fl']
修改一下
//li/a[@class='articleTitle fl']
就可以取到所有的标题了。
但是这样取出来的数据并不是纯文本,他还包含了一些html标签,于是乎在后面加上一个/text()
//li/a[@class='articleTitle fl']/text()
这样就可以获取到一页中的标题了
用python随便写一下试试。
发现取出来之后是乱码,那就肯定是编码问题了,打开F12,查看html中的head,发现是gb2312
提笔忘字之,怎么转换编码来着,百度了一下。
代码语言:javascript复制res = requests.get(url).content
res = res.decode("gb2312")
以前怎么写的忘记了,但应该不是这么麻烦的。
然后是这样的
获取了一页的标题后,然后再获取详情页的链接,因为是a标签,所以只需要在xpath后面加一句/@href就可以获取到这个属性了
//li/a[@class='articleTitle fl']/@href
还得进入里面去获取文章内容咯,于是随便点进去看一下,
详情页地址:https://www.qinghuawang.net/a/1808.html
xpath发现,都是包含在p标签内
于是只要把/p后面的[1]去掉就可以获取到所有的段落咯,再加上一个text()就可以获取到文本了。
然后放到python里面试一下。
然后又报错了,大概意思是gb2312无法解析0xfd
于是百度了一下,
解决之后。
然后就是将这些话保存至txt咯。
最后加几个For循环去爬取所有的内容咯
最后整理代码如下,没进行清洗了,就开了个多线程:
代码语言:javascript复制# -*- coding: utf-8 -*-
"""
-------------------------------------------------
@ Author :Lan
@ Blog :www.lanol.cn
@ Date : 2020/12/19
@ Description:I'm in charge of my Code
-------------------------------------------------
"""
import parsel
import requests
import threading
def getContet(urls):
for i in urls:
url = 'https://www.qinghuawang.net/' i
res = requests.get(url).content
res = res.decode("gb2312", errors='ignore')
xpath = parsel.Selector(res)
content = xpath.xpath("//p/text()").extract()
with open('sentence.txt', 'a ', encoding='utf8') as f:
for j in content:
f.write(j "
")
print(j)
def getAll():
for i in range(1, 20):
url = f'https://www.qinghuawang.net/qinghua/list_1_{i}.html'
res = requests.get(url).content
xpath = parsel.Selector(res.decode('gb2312'))
urlList = xpath.xpath("//li/a[@class='articleTitle fl']/@href").extract()
threading.Thread(target=getContet, args=(urlList,)).start()
if __name__ == '__main__':
getAll()
废了,废了