前情提要
此代码使用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/antispider/?from=%2Fweb%3Fquery%3Dpython%26page%3D7%26ie%3Dutf8&suuid=6969bcac-7309-410c-b2f0-67d2e882e8a5&m=1> from <GET https://www.sogou.com/web?query=python&page=4&ie=utf8>
应该访问的第四页被302重定向到了antispider反爬虫的验证码界面
看到这里,我们采取一下常规措施:
1.更换动态IP
2.伪装header
3.硬刚破解验证码
一步一步来,我们先更换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(