目标网址:链接
抓取内容:标题、正文、时间、其他、
新建一个Scrapy
项目,名字为scrapyuniversal。
scrapy startproject douban_movie
创建一个CrawlSpider
模版。
(.venv) ➜ douban git:(master) ✗ scrapy genspider -l # 查看模版
Available templates:
basic
crawl
csvfeed
xmlfeed
(.venv) ➜ douban git:(master) ✗ scrapy genspider -t crawl douban movie.douban.com
douban.py文件内容如下:
# -*- coding: utf-8 -*-
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from douban_movie.items import DoubanLoader, DoubanMovieItem
class DoubanSpider(CrawlSpider):
name = 'douban'
allowed_domains = ['movie.douban.com']
start_urls = ['https://movie.douban.com/top250?start=0&filter=']
rules = (
Rule(LinkExtractor(restrict_xpaths="//div[@class='hd']"), callback='parse_item'),
Rule(LinkExtractor(restrict_xpaths="//span[@class='next']/a"))
)
def parse_item(self, response):
loader = DoubanLoader(item=DoubanMovieItem(), response=response)
loader.add_xpath('name', '//*[@id="content"]/h1/span[1]/text()')
loader.add_value('url', response.url)
loader.add_xpath('text', '//*[@id="link-report"]/span[1]/span/text()')
yield loader.load_item()
我们主要编写rules
属性,注意这里的默认回调函数不是parse
而是parse_item
。
起始URL:https://movie.douban.com/top250?start=0&filter=
之后Spider爬取start_urls列表下的每个链接,在得到Response
后,Spider
就会根据每个Rule
来提取这个页面内的超链接,去生成进一步的Request。
Rule(link_extractor, callback=None, cb_kwargs=None, follow=None,process_links=None, process_request=None)
Link Extractor
的对象,通过它Spider
可以知道从页面提取那些链接,提取的链接会自动生成Request,它本身是一个数据结构,通常用LxmlLinkExtractor
对象作为参数。Item
或Request
对象的列表。**注意:**避免使用parse()作为回调函数,在CrawlSpider中使用parse()方法实现逻辑。Response
提取的链接是否需要跟进,默认为True
。Rule
提取到每个Request
时,改函数会调用,对Request
进行处理。改函数必须返回Request
或者None
。class LxmlLinkExtractor(FilteringLinkExtractor):
def __init__(self, allow=(), deny=(), allow_domains=(), deny_domains=(), restrict_xpaths=(),
tags=('a', 'area'), attrs=('href',), canonicalize=False,
unique=True, process_value=None, deny_extensions=None, restrict_css=(),
strip=True):
allow_domains
相反。默认排除非网页链接
IGNORED_EXTENSIONS = [
# images
'mng', 'pct', 'bmp', 'gif', 'jpg', 'jpeg', 'png', 'pst', 'psp', 'tif',
'tiff', 'ai', 'drw', 'dxf', 'eps', 'ps', 'svg',
# audio
'mp3', 'wma', 'ogg', 'wav', 'ra', 'aac', 'mid', 'au', 'aiff',
# video
'3gp', 'asf', 'asx', 'avi', 'mov', 'mp4', 'mpg', 'qt', 'rm', 'swf', 'wmv',
'm4a', 'm4v',
# office suites
'xls', 'xlsx', 'ppt', 'pptx', 'pps', 'doc', 'docx', 'odt', 'ods', 'odg',
'odp',
# other
'css', 'pdf', 'exe', 'bin', 'rss', 'zip', 'rar',
]
Item Loader每个字段都包含一个Input Processor
输入处理器和一个Output Process
输出处理器。
Input Processor收到数据后立刻提取数据,结果被收集起来并且保存到Item Loader
中,但是分配给Item
。收集数据完成后,Load_item()
方法被调用来填充再生成Item
对象。在调用时会先调用Output Processor
来处理之前收集到的数据,然后再存入Item
中。
不进行任何处理,直接返回原来的数据
返回列表的第一个非空值,常用作Output Processor
。
相当于字符串Join()方法,可以把列表拼接成字符串,字符串默认空格分隔。可以更改默认分隔符。
用给定的多个函数组合构造的Processor
,每个输入值被传递到第一个函数,其输出再穿入到第二个函数,直到最后一个函数。
与Compose类似,但是它可以处理一个列表的输入值。
可以查询JSON,传入Key,返回查询所得到的Value。不过要先安装Jmespath
库才可以使用。