记糗百的一次爬虫经历

Author Avatar
呃哦 3月 30, 2017
事情起源:
  一次无聊的想要做点东西,发现数据库没点东西,然后就想到去糗百爬点东西,然后就开始了入坑。。。
工具:Python3 scrapy框架

想起以前的爬虫经历,几乎没遇到过什么防爬虫措施,于是就直接开始了调试准备get√xpath表达式的时候,有了第一个坑,

scrapy shell http://www.qiushibaike.com/text/

然后!果断报错了,

然而我竟然就去谷歌 twisted 框架的这个错误,结果可想而知没有答案,最后突然想到一点,好像。。。糗百一直被作为爬虫入门博客的例子。。。估计是被爬怕了,加了 反爬虫机制,,,

  • 于是开始谷歌scrapy伪装浏览器怎么写,最后在项目配置文件setting.py中的DEFAULT_REQUEST_HEADERS加入以下伪装:
    'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0',
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    'Accept-Language': 'en-US,en;q=0.5',
    'Accept-Encoding': 'gzip, deflate',
    'Cookie':'''_xsrf=2|da663c38|074b39a46ce47715d5a3376af4b154b7|1490869563; _qqq_uuid_="2|1:0|10:1490869563|10:_qqq_uuid_|56:ZGY2MzY5ZmI1MTJkNmIzZjQ1ODM1YTVlYTE4NjQ0ZjBhOWEzMmViNg==|cc49d57f4513ac2d3d35b453fe41b11c35c66ac1eb6f214ad7f81f013e3789ba"; Hm_lvt_2670efbdd59c7e3ed3749b458cafaa37=1490869564; Hm_lpvt_2670efbdd59c7e3ed3749b458cafaa37=1490869564; _ga=GA1.2.136222138.1490869564; _gat=1''',
    'Connection': 'keep-alive',
    'Upgrade-Insecure-Requests': '1',
    'If-None-Match': "9de88e87dd2d3140edc8af02a7bc9516598bc9fc"
    }
    
    好了,
    scrapy shell http://www.qiushibaike.com/text/
    
    爬虫调试没问题了,next,
    写好了一切逻辑后,代码如下:
    ```python

    -- coding: utf-8 --

    import scrapy
    from qiushibaike.items import TextItem

class TextSpider(scrapy.Spider):
name = “text”
allowed_domains = [“qiushibaike.com”]
start_urls = [‘http://qiushibaike.com/text/page/1‘]

def parse(self, response):
    item = TextItem()
    li = response.xpath('''//*[@class='content']/span''')
    liContent = list()
    for i in li:
        liContent.append(''.join(i.xpath('text()').extract()))
    item['content'] = liContent
    yield item

    #提取出下一页链接
    nextPage = response.xpath("//*[@class='next']/parent::a/@href").extract()
    if len(nextPage) > 0:
        nextPage = 'http://www.qiushibaike.com' + nextPage[0]
        yield scrapy.Request(nextPage, callback=self.parse)
* 然后,  
```shell
scrapy crawl text

这里去糗百网站看了,text这个栏目是有35页的,但我爬到第12页就报错了,
,

  • 好吧,503错误,Web 服务器目前无法处理HTTP 请求,具体自行维基百度,这个错误对于爬虫来说,还是很容易看出来是哪出问题的:爬虫速度太快,服务器承载不了报错。既然太快,那就需要限制爬虫,好在作为一个强大的爬虫框架,scrapy也有想到了这一点,也有相应的限制措施,以下是在setting.py文件下增加如下配置即可,
    AUTOTHROTTLE_ENABLED = True #开启scrapy的自动限速扩展 注:默认不开启,False
    # The initial download delay
    AUTOTHROTTLE_START_DELAY = 5 #爬虫启动等待时间,单位秒
    # The maximum download delay to be set in case of high latencies
    AUTOTHROTTLE_MAX_DELAY = 60 # 爬虫最大等待时间,这里是照搬官网,用不到这个设置
    DOANLOAD_DELAY = 5 # 爬虫中间下载件每次下载的间隔时间
    CONCURRENT_REQUESTS_PER_DOMAIN = 1 # 爬虫的对单个IP进行并发请求的最大值
    
    如此,爬虫便可以爬完35页了,
    缺点:速度贼慢!

总结:以前爬一些小网站没有这些对应的反爬虫措施,倒是大意了,作为一只爬虫,最基本的怎能不伪装成浏览器呢。。。