Datawhale爬虫 第五期 Day7
实战项目:汽车之家车型论坛帖子信息
作为国内目前第一大汽车论坛,反爬虫很恶心,中间很多坑。
新手,第一次搞这么复杂的爬虫,前期没有排查,都是遇到坑的时候再返回一个一个解决。
直接开始requests,没几次就遇到了302跳转
上代理,之前自己写爬的免费代理经常罢工,还慢,直接买的代。
def get_proxie():
url = 'http://tpv.daxiangdaili.com/ip/?tid=*******&num=1&delay=5&protocol=https' # 代理在线API接口
time.sleep(1)
r = requests.get(url,timeout=8)
if r.status_code == 200:
ip = r.text
return ip
else:
time.sleep(1)
return get_proxie()
选择要爬的论坛,防止新发帖没有爬取到,选择按最新发布排序,然后从最后一页爬
https://club.autohome.com.cn/bbs/forum-c-4683-1.html?orderby=dateline
加上代理IP,heraders,开干
最先开始只判读返回状态码,结果爬了几页后发现返回状态码也是200,但是返回的数据居然变成了奥迪RS论坛的数据。
这里没有截图,等有了补上
然后就是根据论坛列表,先找到帖子链接。 因为论坛列表第一页会全站置顶的帖子及广告内容。还有版内置顶的帖子。xpath会把这些帖子匹配到,这里我用的正则匹配。
代码:
club_list = requests.get(list_url, headers = headers, timeout=8, proxies=proxy)
if '捷途X70论坛' in str(club_list.text):
print('解析成功,正在获取帖子链接', list_url)
pattern = re.compile('<dl.*?list_dl.*?lang.*?">.*?<a.*?href="(.*?)">.*?</dl>',re.S)
items = re.findall(pattern, club_list.text)
for item in items:
if '#pvareaid' in item:
pass
else:
topic_url = 'https://club.autohome.com.cn' + item
topic_list_url.append(topic_url)
else:
proxies = {
'https': 'https://' + str(get_proxie())
}
return get_url_list(list_url, headers, proxies)
return topic_list_url
except:
proxies = {
'https': 'https://' + str(get_proxie())
}
return get_url_list(list_url, headers, proxies)
获取帖子链接后就可以爬帖子内容了,这里又遇到一个坑。汽车之家的帖子被删除后,链接还是会返回404的状态码,只是内容被删除了,但还是能得到我要的数据。不管,也爬。
得到想的html后,然后就可以用xpath取内容。happy~~
但是,又遇到一个坑。爬了没几个帖子后,居然又报错了。xpath找不到对应的内容。打开链接发现除了正常的帖子外,还有视频帖,还是有我想的要数据,继续改。
def parse_one_page(url,html):
#html = str(html)
tree = etree.HTML(html)
topic = tree.xpath('//*[@id="F0"]')
TopicInfo = {
}
if topic:
print(