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浏览器,并配置好才能使用。。。