百度贴吧针对Xpath的爬虫的反扒策略与解决方式
1.下载美剧吧html
打开谷歌浏览器,贴吧中搜索美剧吧,使用ctrl+s的方式保存页面。或打开菜单>更多工具>网页另存为>命名为meiju1.html
2.
找到一个帖子,鼠标右键选择检查
使用Xpath helper尝试匹配
# 匹配成功
//div[contains(@class,"threadlist_title pull_left j_th_tit")]
# 取出文本
//div[contains(@class,"threadlist_title pull_left j_th_tit")]/a/text()
新建一个项目
把meiju1.html和新建的py文件放进根目录
# //div[contains(@class,"threadlist_title pull_left j_th_tit")]/a/text()
import lxml.etree as le
# 以utf-8编码方式打开meiju1.html
with open('meiju1.html', 'r', encoding='utf-8') as f:
html = f.read()
html_x = le.HTML(html)
# 可以看到返回的是一个迭代器对象
print(html_x)
title_s = html_x.xpath('//div[contains(@class,"threadlist_title pull_left j_th_tit")]/a/text()/')
# 可以看到文本是以列表形式存储的
print(title_s)
for title in title_s:
print(title)
但替换成meiju2.html发现不能正常读取,打开meiju2发现里面的内容都被注释掉了,这样我们使用正则表达式
找到之前匹配的xpath语法中要匹配的class标签
threadlist_title pull_left j_th_tit
打开meiju2,ctrl+r把上面的匹配标签复制到里面,可以发现其子标签就是我们要查找的,根据位置编写正则表达式
import re
with open('meiju2.html', 'r', encoding='utf-8') as f:
# 读取文件并加上换行符
html = re.sub('\n', '', f.read())
print(html)
# 正则表达式
title_pattern = '<div class="threadlist_title pull_left j_th_tit ">.*?<a.*?>(.*?)</a>'
title_s = re.findall(title_pattern, html)
# title_s为列表形式
print(title_s)
for title in title_s:
print(title)
总结:有的网站是在html把关键内容注释阻止xpath读取,我们可以使用正则表达式去读取