Week5 情话网小爬虫

2022-07-13 21:44:42 浏览数 (1)

太久没写爬虫了,手生到连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()

废了,废了

0 人点赞