之前的文章我们介绍了一下 Xpath 模块, 接下来我们就利用 Xpath 模块爬取《糗事百科》的糗事.
之前我们已经利用 re 模块爬取过一次糗百, 我们只需要在其基础上做一些修改就可以了, 为了保证项目的完整性, 我们重新再来一遍.
我们要爬取的网站链接是 https://www.qiushibaike.com/text/page/1/ .
我们通过 Xpath Helper 的谷歌插件经过分析获取到我们想要的内容为: //div[@class="content"]/span[1]
然后我们就可以通过 text() 来获取里面的内容了, //div[@class="content"]/span[1]/text()
- import urllib.request
- from lxml import etree
- import ssl
- # 取消代理验证
- ssl._create_default_https_context = ssl._create_unverified_context
- url = "https://www.qiushibaike.com/text/page/1/"
- # User-Agent 头
- 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'
- headers = {'User-Agent': user_agent}
- req = urllib.request.Request(url, headers=headers)
- response = urllib.request.urlopen(req)
- # 获取每页的 HTML 源码字符串
- HTML = response.read().decode('utf-8')
- # 解析 HTML 为 HTML 文档
- selector = etree.HTML(HTML)
- content_list = selector.xpath('//div[@class="content"]/span[1]/text()')
- print(content_list)
输出结果为:
从上面的输出结果可以看出我们已经拿到了我们想要的数据, 并且是一个列表类型, 我们对列表进行操作扥别拿到糗事再存储到本地即可.
- for item in item_list:
- item = item.replace("\n", "")
- self.writePage(item)
上面的代码中 item_list 即为我们上面所获取到的 content_list 列表, 在之前通过 re 模块获取数据时通过对列表的内容分析, 我们发现有 <span> ,<span class="contentForAll"> 查看全文,</span>,<br/>,\n 等多余内容, 而通过 Xpath 只有 \n 为多余, 我们通过 replace 方法将其转为空, 剩下的就是我们想要的内容了, 接下来就是存储到本地即可了.
上面就可以实现一个获取 糗事百科 的糗事的简单爬虫, 但是只能爬取单个页面的内容, 通过分析 url 我们发现 https://www.qiushibaike.com/text/page/1/ 中最后的 1 即为页码, 我们就可以根据这个页码逐一爬取更多页面的内容, 最终的代码如下:
- import urllib.request
- from lxml import etree
- import ssl
- # 取消代理验证
- ssl._create_default_https_context = ssl._create_unverified_context
- class Spider:
- def __init__(self):
- # 初始化起始页位置
- self.page = 1
- # 爬取开关, 如果为 True 继续爬取
- self.switch = True
- def loadPage(self):
- """
- 作用: 打开页面
- """ url ="https://www.qiushibaike.com/text/page/"+ str(self.page) +"/"
- # User-Agent 头
- 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'
- headers = {'User-Agent': user_agent}
- req = urllib.request.Request(url, headers=headers)
- response = urllib.request.urlopen(req)
- # 获取每页的 HTML 源码字符串
- HTML = response.read().decode('utf-8')
- # 解析 HTML 为 HTML 文档
- selector = etree.HTML(HTML)
- content_list = selector.xpath('//div[@class="content"]/span[1]/text()')
- # 调用 dealPage() 处理糗事里的杂七杂八
- self.dealPage(content_list)
- def dealPage(self, item_list):
- """
- @brief 处理得到的糗事列表
- @param item_list 得到的糗事列表
- @param page 处理第几页
- """
- for item in item_list:
- item = item.replace("\n", "")
- self.writePage(item)
- def writePage(self, text):
- """
- @brief 将数据追加写进文件中
- @param text 文件内容
- """ myFile = open("./qiushi.txt",'a') # 追加形式打开文件
- myFile.write(text + "\n\n")
- myFile.close()
- def startWork(self):
- """
- 控制爬虫运行
- """
- # 循环执行, 直到 self.switch == False
- while self.switch:
- # 用户确定爬取的次数
- self.loadPage()
- command = input("如果继续爬取, 请按回车 (退出输入 quit)")
- if command == "quit":
- # 如果停止爬取, 则输入 quit
- self.switch = False
- # 每次循环, page 页码自增 1
- self.page += 1
- print("爬取结束!")
- if __name__ == '__main__':
- # 定义一个 Spider 对象
- qiushiSpider = Spider()
- qiushiSpider.startWork()
最终会在本地添加一个 qiushi.txt 的文件, 结果如下:
来源: https://www.cnblogs.com/weijiutao/p/10880805.html