-
fake-useragent请求知乎的坑
- 在用scrapy爬取知乎的时候,用fake-useragent模块随机添加请求头的时候发现知乎跳转到一个提示浏览器版本过低的网页。
- 用fake-useragent添加请求头请求别的网站的时候都没有出现过这种问题。
- 我将请求头换成自己使用的chroem浏览器的请求头的时候,没有异常。
- 我又用fake-useragent重新请求,发现也没有异常。
- 再次用fake-useragent重新请求,又跳转到一个提示浏览器版本过低的网页。
我百思不得其解,自己思考如下:综合1、3,说明fake-useragent应该没问题的,综合3、4我怀疑这是知乎使用的一种反爬机制,故意将错误引到浏览器版本过低的网页,但实际问题并不在此,在这中间花了整整半天时间,后面我又想到用我的另外一台电脑,然后将浏览器的useragent发送过来,然后使用发送过来的useragent重新请求知乎,发现并没有异常。于是猛然想到fake-useragent中的useragent是随机提取出来的,是不是有的提取出来的useragent是比较老旧的,所以知乎识别处理啊,导致出现异常呢?为了验证自己的想法,我又用fake-useragent随机提取的useragent反复请求,有的能成功,有的提示浏览器版本低的异常,遂验证了我的想法。
综上:知乎是一个对浏览器版本要求很高的网站,很多旧版的浏览器都不能访问知乎,而fake-useragent内的请求头数据并没有一直更新到最新,只能测试多个,然后选择可用的即可。
scrapy shell 添加 user-gent的坑
- 在用scrapy shell -s USER_AGENT=‘Mozilla/5.0 (Windows NT 10.0; …) Gecko/20100101 Firefox/60.0‘ +请求网址 的时候报一些异常的错误,发现这个是由于自己平时引号都用单引号,但是此处的Mozilla/5.0 (Windows NT 10.0; …) Gecko/20100101 Firefox/60.0必须要用双引号括起来才行!
requests请求user-gent的坑
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; …) Gecko/20100101 Firefox/60.0'}
re = requests.get(url, headers=headers)
re.encoding = re.apparent_encoding
print(re.text)
报错如下:
UnicodeEncodeError: 'latin-1' codec can't encode character 'u2026' in position 30: ordinal not in range(256)
此错误看着是编码错误,实际上不是,我换一个user-agent又可以了,其实这是因为浏览器在显示User-Agent属性时,应为属性值过长,所以使用了省略号,导致添加过程中造成了编译错误。
方法策略:如果scrapy中有多个item的时候,该如何将不同的item在pipeline中作不同的处理呢?
- item.__class__.__name__ == 'item 的名字'
- 在各自定义的item中间添加inser方法。