**
用xpath定位lxml解析爬取糗事百科段子数据
**
学习经历
学习python从基础到爬虫总共花了5个月不到的时间,从一个小白到现在能够自己写下爬虫代码,期间基础部分就花了4个月的时间学习,打好基础才是硬道理。
使用第三方库
谷歌浏览器
requests
lxml中的etree函数
由于糗事百科经常会改版,使网上很多的文章中的代码都无法使用,正好我也学了一阶段的python爬虫,用学到的知识写下一下文章,有错误的地方请大神们多多指点。
糗事百科段子链接:https://www.qiushibaike.com/text/
打开后使用检查工具对文章的定位
发现我们要的数据都在这个标签下:
我们用安装好的谷歌浏览器中的xpath开始定位元素
PS:如果直接用xpath定位元素直接使用会发现爬取的数据是空列表,绝对路径lxml是无法获取数据的,那就要用相对路径。
关于如何使用xpath定位元素可以网上查找,很多大神们都有文章介绍。
下面我们已经找到了要爬取的数据开始写代码吧。
import requests #导入requests
from lxml import etree #导入lxml中的etree函数
#爬取的url地址
url = 'https://www.qiushibaike.com/text/'
#网站可能会反爬所以设置了请求头部
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36'
}
#用respons接受网站请求并把接受的数据变成bety类型
respons = requests.get(url,headers=headers).content
#解析
html = etree.HTML(respons)
#定位元素,这里使用了相对路径
qiushi_info = html.xpath('//*[@class="col1 old-style-col1"]/div')
#创建一个空字典,准备接受爬取下来的数据并写入txt文件
dic = {}
with open('糗事百科段子.txt', 'w', encoding='utf-8') as f:
for i in qiushi_info:
name = i.xpath('./div/a/h2/text()')
#因为爬取的文件中带有空格符号所以再一次用循环把前后的空格符给去掉了
for y in name:
dic['name_y'] = y.strip()
f.write('作者:' + dic['name_y']+'\n\n')
info = i.xpath('./a/div/span[1]/text()')
# 因为爬取的文件中带有空格符号所以再一次用循环把前后的空格符给去掉了
for z in info:
dic['info_z'] = z.strip()
f.write(dic['info_z']+'\n\n')
网站对文字部分进行了反爬处理
这里有分段
正常爬取下来会对数据进行空格处理,如果直接用strip()去空格会把文章的第二个段落给直接删除,从而得到不完整的文章。这里我用的循环来处理。
最终的数据效果:
这里我只爬取了第一页的段子文章,如何翻页获取更多的文章这里就不详细写了,有点基础的童鞋们都应该会。其实我这里还是有个小BUG的,有时候爬取的数据作者会出现相同,有兴趣的童鞋们可以和我交流下。