之前的文章我们介绍了一下 Xpath 模块,接下来我们就利用 Xpath 模块爬取《糗事百科》的糗事。
之前我们已经利用 re 模块爬取过一次糗百,我们只需要在其基础上做一些修改就可以了,为了保证项目的完整性,我们重新再来一遍。
我们通过 Xpath Helper 的谷歌插件经过分析获取到我们想要的内容为: //div[@class="content"]/span[1]
然后我们就可以通过 text() 来获取里面的内容了, //div[@class="content"]/span[1]/text()
1 importurllib.request2 from lxml importetree3 importssl4
5 #取消代理验证
6 ssl._create_default_https_context =ssl._create_unverified_context7
8 url = "https://www.qiushibaike.com/text/page/1/"
9 #User-Agent头
10 user_agent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.157 Safari/537.36'
11 headers = {'User-Agent': user_agent}12 req = urllib.request.Request(url, headers=headers)13 response =urllib.request.urlopen(req)14 #获取每页的HTML源码字符串
15 html = response.read().decode('utf-8')16 #解析html 为 HTML 文档
17 selector =etree.HTML(html)18 content_list = selector.xpath('//div[@class="content"]/span[1]/text()')19 print(content_list)
输出结果为:
从上面的输出结果可以看出我们已经拿到了我们想要的数据,并且是一个列表类型,我们对列表进行操作扥别拿到糗事再存储到本地即可。
1 for item initem_list:2 item = item.replace("\n", "")3 self.writePage(item)
上面的代码中 item_list 即为我们上面所获取到的 content_list 列表,在之前通过 re 模块获取数据时通过对列表的内容分析,我们发现有 ,查看全文,,
,\n 等多余内容,而通过 Xpath 只有 \n 为多余,我们通过 replace 方法将其转为空,剩下的就是我们想要的内容了,接下来就是存储到本地即可了。
上面就可以实现一个获取 糗事百科 的糗事的简单爬虫,但是只能爬取单个页面的内容,通过分析 url 我们发现 https://www.qiushibaike.com/text/page/1/ 中最后的 1 即为页码,我们就可以根据这个页码逐一爬取更多页面的内容,最终的代码如下:
1 importurllib.request2 from lxml importetree3 importssl4
5 #取消代理验证
6 ssl._create_default_https_context =ssl._create_unverified_context7
8
9 classSpider:10 def __init__(self):11 #初始化起始页位置
12 self.page = 1
13 #爬取开关,如果为True继续爬取
14 self.switch =True15
16 defloadPage(self):17 """
18 作用:打开页面19 """
20 url = "https://www.qiushibaike.com/text/page/" + str(self.page) + "/"
21 #User-Agent头
22 user_agent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.157 Safari/537.36'
23 headers = {'User-Agent': user_agent}24 req = urllib.request.Request(url, headers=headers)25 response =urllib.request.urlopen(req)26 #获取每页的HTML源码字符串
27 html = response.read().decode('utf-8')28 #解析html 为 HTML 文档
29 selector =etree.HTML(html)30 content_list = selector.xpath('//div[@class="content"]/span[1]/text()')31 #调用dealPage() 处理糗事里的杂七杂八
32 self.dealPage(content_list)33
34 defdealPage(self, item_list):35 """
36 @brief 处理得到的糗事列表37 @param item_list 得到的糗事列表38 @param page 处理第几页39 """
40 for item initem_list:41 item = item.replace("\n", "")42 self.writePage(item)43
44 defwritePage(self, text):45 """
46 @brief 将数据追加写进文件中47 @param text 文件内容48 """
49 myFile = open("./qiushi.txt", 'a') #追加形式打开文件
50 myFile.write(text + "\n\n")51 myFile.close()52
53 defstartWork(self):54 """
55 控制爬虫运行56 """
57 #循环执行,直到 self.switch == False
58 whileself.switch:59 #用户确定爬取的次数
60 self.loadPage()61 command = input("如果继续爬取,请按回车(退出输入quit)")62 if command == "quit":63 #如果停止爬取,则输入 quit
64 self.switch =False65 #每次循环,page页码自增1
66 self.page += 1
67 print("爬取结束!")68
69
70 if __name__ == '__main__':71 #定义一个Spider对象
72 qiushiSpider =Spider()73 qiushiSpider.startWork()
最终会在本地添加一个 qiushi.txt 的文件,结果如下: