最近又尝试着爬取了百度贴吧,发现新增的几个反爬点,故来做下记录。
爬取百度贴吧大致流程为:
1 - 构造url,headers
2 - 发送请求,获取响应
3 - 数据解析
4 - 翻页
使用工具:python,requests,lxml
操作步骤讲解环节
下面就是喜闻乐见的操作步骤讲解环节了(´◔౪◔)
代码部分:
import requests
from lxml import etree
class TieBa(object):
def __init__(self, name):
self.url = 'https://tieba.baidu.com/f?ie=utf-8&kw={}'.format(name)
self.headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.182 Safari/537.36 Edg/88.0.705.81',
# 版本较low的浏览器UA,不会屏蔽html内容
# 不过也可以使用response.content.decode('utf-8').replace('', '')
# 'User-Agent': 'Mozilla/4.0 '
}
def run(self):
while True:
response = requests.get(self.url, headers=self.headers)
with open('index.html', 'wb')as f:
f.write(response.content)
re = response.content.decode('utf-8').replace('', '')
html = etree.HTML(re)
a = html.xpath('//li[@class=" j_thread_list clearfix thread_item_box"]/div/div[2]/div[1]/div[1]/a')
for i in a:
print(i.xpath('./text()')[0], 'https://tieba.baidu.com/' + i.xpath('@href')[0])
# 下一页
try:
self.url = 'https:' + html.xpath('//*[contains(text(),"下一页")]/@href')[0]
print(self.url)
except:
break
if __name__ == '__main__':
tieba = TieBa('百度')
tieba.run()
要点总结:
1 - 当UA使用较高版本时,响应的内容会屏蔽一部分代码,这时可以使用较低的UA进行处理,当然也可以替换掉屏蔽符实现反屏蔽的目的。
2 - 使用xpath获得的节点对象,在还没进行text()或提取属性前,还可以针对该对象再一次进行xpath操作。
3 - 当定位不到翻页时,则已经到达了尾页,这时break退出循环。
那么本次的分享就到这里了,喜欢的话麻烦点赞关注一下;不喜欢的话可以去看下小编的其他文章,肯定有喜欢的;都不喜欢的话可以点个关注,万一以后有喜欢的呢(๑•̀ㅂ•́)و✧
有疑问的小伙伴也可以在评论区留言哦,我会第一时间解答的。
你点了吗◔ ‸◔?