爬虫中遇到的问题汇总

Posted Nanrou

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了爬虫中遇到的问题汇总相关的知识,希望对你有一定的参考价值。

------------------3.10----------------------

在爬取某个网站时,直接用lxml.etree对response.content进行分析拿到的数据,与保存到本地后再分析拿到数据不一致

 1 url = http://op.hanhande.com/mh/
 2 HEADERS = {User-Agent: Mozilla/5.0 (Windows NT 10.0; rv:51.0) Gecko/20100101 Firefox/51.0 }
 3 
 4 #直接分析
 5 response = requests.get(url, headers=HEADERS)
 6 body = etree.html(response.content)
 7 us = body.xpath(//div[@class="mh_list_li"]/ul/li/a/@href)
 8 ts = body.xpath(//div[@class="mh_list_li"]/ul/li/a/text())
 9 print(len(us), len(ts))
10 #保存后分析
11 with codecs.open(body.html, w, encoding = response.encoding) as f:
12     f.write(response.content.decode(response.encoding))
13 with codecs.open(body.html, r) as f:
14     body = f.read()
15     body = etree.HTML(body)
16     us = body.xpath(//div[@class="mh_list_li"]/ul/li/a/@href)
17     ts = body.xpath(//div[@class="mh_list_li"]/ul/li/a/text())
18     print(len(us), len(ts))

运行结果为:

14 14
582 582

 

猜测可能是编码的问题,但是不知道如何确定。

 

 

------------------3.08----------------------

文件非法命名的问题

在windows下如 ?\ * | “ < > : /;都是非法字符,不允许在文件名中出现,按正常来讲,一旦出现这种情况,应该会有异常抛出,但是在使用pycharm的时候,这个异常并没有被发现,而直接在cmd下运行python就会有异常抛出。

解决方法:

就是在创建文件时,对文件名进行判断,如果有非法字符就替换调,如:str.replace(‘?‘, ‘‘)

 

请求超时的问题

1 try:
2     response = await self.session.get(
3         url, allow_redirects = False, headers=HEADERS
4     )
5     break
6 except aiohttp.ClientError as client_error:
7     exception = client_error

这是500lines 里 crawl 的连接部分的一小段代码,这个异常捕捉的确是可以捕捉到所有的连接异常,但是在实际运行中,超时异常并没有被捕捉到,不知道是否因为是windows的锅,但是后来再加上 except asyncio.TimeoutError 就可以捕捉到超时异常了。

ps:其实在看了源码之后,aiohttp.TimeoutError也是继承了 asyncio.TimeoutError的,那为什么aiohttp的就不能被捕捉到呢,待解决。

以上是关于爬虫中遇到的问题汇总的主要内容,如果未能解决你的问题,请参考以下文章

scrapy主动退出爬虫的代码片段(python3)

Scrapy爬虫错误日志汇总

爬虫遇到头疼的验证码?Python实战讲解弹窗处理和验证码识别

精选文章推荐汇总-2018.03.01

常用正则表达式最强汇总(含Python代码举例讲解+爬虫实战)

爬虫问题汇总 + 解决