关于使用scrapy框架编写爬虫以及Ajax动态加载问题、反爬问题解决方案 (3)

发现新增了一个get请求,并且响应为JSON格式。观察JSON的内容,发现正是需要抓取的内容。

抓取内容的问题解决了,接下来处理多页抓取问题,因为请求为get形式,所以首先进行几次下拉刷新,观察请求链接的变化,会发现请求的地址中只有start的值在变化,并且每次刷新增加20,其他都不变,所以我们更改这个参数就可以实现翻页。

由于之前已经在items.py中对需要抓取的数据做了声明,所以只需要在scraoyspider/spiders目录下创建一个新的爬虫文件douban_actions.py,代码如下:

import re

import json

 

from scrapy import Request

from scrapy.spiders import Spider

from scrapyspider.items import DoubanMovieItem

 

class DoubanAJAXSpider(Spider):

    name = 'douban_ajax' #设置爬虫名字为douban_ajax

    headers = {

        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36',

    } #设置请求头文件,模拟浏览器访问(涉及反爬机制)

    def start_requests(self):

        url = 'https://movie.douban.com/j/chart/top_list?type=5&interval_id=100%3A90&action=&start =0&limit=20'

        yield Request(url, headers=self.headers)

 

    def parse(self, response):

        datas = json.loads(response.body)#Json格式数据处理为字典类型

        item = DoubanMovieItem()

        if datas:

            for data in datas:

                item['ranking'] = data['rank']

                item['movie_name'] = data['title']

                item['score'] = data['score']

                item['score_num'] = data['vote_count']

                yield item

 

            # 如果datas存在数据则对下一页进行采集

            page_num = re.search(r'start=(\d+)', response.url).group(1)

            page_num = 'start=' + str(int(page_num)+20)

            next_url = re.sub(r'start=\d+', page_num, response.url)

    #处理链接

            yield Request(next_url, headers=self.headers)

    #请求下一页

 

运行爬虫

 

  scrapy crawl douban_ajax -o douban_movie.csv

 

 

然而,很多时候ajax请求都会经过后端鉴权,不能直接构造URL获取。这时就可以通过PhantomJSchromedriver等配合Selenium模拟浏览器动作,抓取经过js渲染后的页面。

使用这种方法有时会遇到定位网页页面元素定位不准的情况,这时就要注意网页中的frame标签,frame标签有framesetframeiframe三种,frameset跟其他普通标签没有区别,不会影响到正常的定位,而frameiframeselenium定位而言是一样的,需要进行frame的跳转。(这两点暂不展开,在抓取中财网—数据引擎网站时就遇到此类问题)

 

 

彩蛋

两个提高效率的Chrome插件

  Toggle JavaScript  (检测网页哪些内容使用了异步加载)  

  JSON-handle (格式化Json串)

 

 

3、关于突破爬虫反爬机制

 

   目前使用到的反反爬手段主要有三个:

 

1、在请求之间设置延时,限制请求速度。(使用python time库)

 

2、在每次请求时都随机使用用户代理User-Agent,为了方便,在scrapy框架中,可以使用fake-useragent这个开源库。

Github地址:https://github.com/hellysmile/fake-useragent

 

3、使用高匿代理ip,同样为了方便,在scrapy框架中编写爬虫,建议使用开源库 scrapy-proxies

Github地址:https://github.com/aivarsk/scrapy-proxies

 

参考内容地址:https://zhuanlan.zhihu.com/p/24769534

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzfsfw.html