前情提要
此代码使用scrapy框架爬取特定“关键词”下的搜狗常规搜索结果,保存到同级目录下csv文件。并非爬取微信公众号文章,但是绕过验证码的原理相同。如有错误,希望大家指正。
URL结构
https://www.sogou.com/web?query={关键词}&page={n}
开始爬取
scrapy常规操作就不唠叨了,上代码
class SougouSearchSpider(scrapy.Spider): name = 'sogou_search' allowed_domains = ['www.sogou.com'] start_urls = ['https://www.sogou.com/web?query=python&page=1'] def start_requests(self): for url in self.start_urls: yield scrapy.Request(url=url, callback=self.parse)
一顿操作后,发现刚爬了3页,就停止了。报错如下
2020-06-11 16:05:15 [scrapy.downloadermiddlewares.redirect] DEBUG: Redirecting (302) to <GET http://www.sogou.com/ant
应该访问的第四页被302重定向到了antispider反爬虫的验证码界面
看到这里,我们采取一下常规措施:1.更换动态IP2.伪装header3.硬刚破解验证码
一步一步来,我们先更换IP。这里我使用的是使用Redis的免费代理IP池:ProxyPool,Github地址。非常nice,代码十分简练。
import requests proxypool_url = 'http://127.0.0.1:5555/random' def get_random_proxy(): response = requests.get(proxypool_url) try: if response.status_code == 200: return response.text.strip() except ConnectionError: return None
遗憾的是,只换IP不太行,还是会被302到antispider页面。接下来,我们伪装一下header,先看一下request.header。手动搜索,然后F12查看。
user-agent可以由fake_useragent随机生成,Github地址。难的是cookies。
ssuid=6821