Scrpay-动态页面爬取

Scrapy 使用2.0

动态页面处理

Scrapy发起Request后,返回的response中往往包含了结果。如今,越来越多的网页变为经过JavaScript渲染的页面,Scrapy可以和Selenium或者Pyppeteer这类库融合使用来实线渲染页面的抓取。

案例:

实例网站: https://dynamic5.scrape.center/

该示例网站带分页功能,只需要在URL上加上/page/页码就可以跳转到下一页。

新建项目:

scrapy startproject scrapypyppeteer

进入项目,新建Spider book

cd scrapypyppeteer
scrapy genspider book dynamic5.scrape.center

修改Spider文件夹下名为spider.py的文件:

# -*- coding: utf-8 -*-

import scrapy

class BookSpider(scrapy.Spider):
    name = 'book'
    allowed_domains = ['dynamic5.scrape.center']
    base_url = 'http://dynamic5.scrape.center/page/{page}'
    max_page=10
    
    def start_requests(self):
    	for page in range(1,self.max_page+1):
    		url=self.base_url.format(page=page)
    		yield Request(url,callbak=self.parse_index)
    
    def parse_index(self, response):
        print(reponse.text)

用pip3安装一个组件,Scrapy和Pyppeteer的中间件

pip3 install gerapy-pyppeteer

该组件提供了两部分内容,一部分是Downloader Middleware,一部分是Request。

开启中间件,在settings里面开启,配置如下:

DOWNLOADER_MIDDLEWARES = {
    'gerapy_pyppeteer.downloadermiddlewares.PyppeteerMiddleware': 543,
}

然后,将Spider中定义的request修改为PyppeteerRequest:

		  # yield Request(url,callbak=self.parse_index) #注释部分为修改部分
            yield PyppeteerRequest(url, callback=self.parse_index, wait_for='.item .name')

为了方便观察,需要修改并发限制,Pyppeteer的Headless模式设置为false:

CONCURRENT_REQUESTS = 3
GERAPY_PYPPETEER_HEADLESS = False

重新运行Spider,爬取过程中,Pyppeteer对应的谷歌浏览器会弹出并逐项加载页面内容,加载完成后页面也会关闭。

最后修改book.spider文件内容,对爬取内容进行分标签:

from gerapy_pyppeteer import PyppeteerRequest
from scrapy import Request, Spider
# -*- coding: utf-8 -*-

import scrapy

class BookSpider(scrapy.Spider):
    name = 'book'
    allowed_domains = ['dynamic5.scrape.center']
    base_url = 'http://dynamic5.scrape.center/page/{page}'
    max_page=10
    def start_requests(self):
        for page in range(1,self.max_page+1):
            url=self.base_url.format(page=page)
            yield PyppeteerRequest(url, callback=self.parse_index, wait_for='.item .name')
    def parse_index(self, response):
        print(reponse.text)

    def parse_index(self, response):
        for item in response.css('.item'):
            name = item.css('.name::text').extract_first()
            authors = item.css('.authors::text').extract_first()
            name = name.strip() if name else None
            authors = authors.strip() if authors else None
            yield {
            'name': name,
            'authors': authors
            }

启动:

scrapy crawl book

tips:初次使用Pyppeteer,需要下载Chrome浏览器,并配置好才能使用。。。

你可能感兴趣的:(Scrpay-动态页面爬取)