由于需求,边查边写边改写出了这个还算能用的代码,拿出来分享下。
代码中都有注释,应该基本都能看懂,根据自己需求可以稍微改改就可以用。
针对百度安全验证的问题
爬取次数太多会出现人机验证,为了解决这个问题,查了很多资料,有的说,在headers部分加入 'Accept’参数,有的说多加几个参数,我都进行了尝试,但是基本都没啥用。
为了不让其运行过程中因为验证问题出现中断,我加入了while True 的无限循环,如果出现验证问题,则休眠40秒,直到百度安全验证时限过去。
(这里存在一个小小的机制,这也许是我的猜测,不一定准确。我之前在做微博爬虫的时候也会出现验证的问题,在尝试了很多次后,发现这个验证问题是有时限的,大概3-5分钟就会过去,就又可以爬取,所以我在这里设置了无线循环,如果出现验证,则休眠,直到时限过去,继续爬取,这样就不会因为验证问题而中断)
此外,为了避免爬取太频繁,我在每个查询词爬取完成后,让程序休眠3秒。
while True:
resp = geturl(keyword, 0) # 接受返回的页面
soup = BeautifulSoup(resp, "html.parser") # 使用bs4进行解析
if soup.title.string == "百度安全验证":
print(keyword)
print("百度安全验证,等待中......")
time.sleep(40)
else:
nums_text = soup.find_all(text=re.compile("百度为您找到相关结果(.*?)个"))[-1] # 获取百度搜索结果的数量,不能根据标签获取内容,因为百度标签属性会不定时的改变。 # 百度为您找到相关结果约100,000,000个 百度为您找到相关结果0个
print(nums_text)
nums_text1 = re.sub(r'\D', "", str(nums_text)) # 删除非数字字符串
return nums_text1
break
虽然解决了最大的问题,但是程序还是会因为各种问题偶尔会中断,无需管出现的错误,只需重新运行即可,如果连续几次程序没有运行完就中断,那就要查查出现错误的原因了。
版权声明:本文为qq_16397025原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。