学习用scrapy写爬虫时遇到了网站的反爬,需要自定义下用户代理和Cookies,改掉Scrapy工程里的设置后发现Scrapy Shell并没有跟着被设置,需要单独修改,这里记录在一起。
包括两部分的设置,一个是Scrapy工程本身,一个是Scrapy shell的设置。
Pycharm Scrapy工程
-
打开settings.py
-
设置
USER_AGENT = ‘Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36’
(这个是最基础的修改方法,如果想要有一个代理池,每次请求网页都随机一个可以参考文章Scrapy学习篇(十一)之设置随机User-Agent) -
设置
COOKIES_ENABLED = False
-
在
DEFAULT_REQUEST_HEADERS
中加入'cookies': 'cookies的值'
注意:这三个参数本来是被注释掉的,需要解开注释
USER_AGENT这个参数Scrapy会给一个默认的代理,会被限制代理的网站反爬,这里只需要在网上随便搜索一个浏览器的代理换掉默认的就可以,我这里用的我自己mac chrome的代理,直接复制粘贴。
COOKIES_ENABLED这个参数设置为False就是使用Scrapy默认的Cookie,这个设置好后再修改一下默认的Cookies就好了。
cookies这个值主要是针对需要登陆才能爬取的网站,具体获取方法为如下:- 手动登陆该网站的账号 2.F12打开调试 3.随便找一个network请求,查看请求头,找到里面的Cookies 4.复制粘贴(如图所示)
这样之后Scrapy工程就可以正常爬取网页内容了,接下来是Scrapy Shell的修改方法
Scrapy Shell
在terminal中:
-
进入爬虫的虚拟环境
-
下载安装ipython
pip install ipython
-
输入以下命令
scrapy shell # 进入scrapy shell url = 'www.baidu.com' # 要爬取的网页地址 headers = {'User-Agent': '你的代理'} cookies = {'key1': 'value1', 'key2': 'value2'} # 将cookie变为键值对的字典模式 req = scrapy.Request(url, cookies=cookies, headers=headers) # 设置请求头和cookie fetch(req) # 执行请求 # 至此Scrapy Shell应该已经成功请求到了网页源码,使用以下代码可以查看请求到的页面 view(response)
补充:在浏览器中复制粘贴的cookies不是键值对,是类似于以下的字段:_ga=GA1.2.1546398633.1612486847; __gads=ID=38e84e9507ee99d7:T=1612486847:S=ALNI_MZ7YnywlkO2yMq7OpO1BY0hPsHfLw; UM_distinctid=17770e96e5079f-0367ea4cd548b3-33647309-168000-17770e96e51888;
可以用以下python代码处理为键值对:
cookie_str = 'ga=GA1.2.1546398633.1612486847; __gads=ID=38e84e9507ee99d7:T=1612486847:S=ALNI_MZ7YnywlkO2yMq7OpO1BY0hPsHfLw; UM_distinctid=17770e96e5079f-0367ea4cd548b3-33647309-168000-17770e96e51888;'
cookie = {}
for line in cookie_str.split(';'):
key, value = line.split('=', 1)
cookie[key] = value
print(cookie)
再复制粘贴到shell
如果fetch后结果显示如下,就应该已经成功请求网页了。