搭建一个基础爬虫
1.新建项目:
scrapy startproject scrapyuniversaldemo
2.查看可用模版并指定crawl模版创建爬虫
scrapy genspider -l
# 查看模版非必要
scrapy genspider -t crawl movie ssr1.scrape.center
3.在爬虫的rules中使用Rule来定义index页中的爬取逻辑和解析逻辑
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from ..items import MovieItem
class MoiveSpider(CrawlSpider):
name = 'movie'
allowed_domains = ['ssr1.scrape.center']
start_urls = ['http://ssr1.scrape.center/']
rules = (
Rule(LinkExtractor(restrict_css='.item .name'), callback='parse_detail', follow=True),
Rule(LinkExtractor(restrict_css='.next'), follow=True)
)
这里用到了Rule的三个参数:link_extractor、callback、follow
- link_extractor:一个LinkExtractor对象,指向需要提取的链接,提取出的链接会自动生成Request;
- callback:指向负责处理response的方法,该方法会返回包含Item或Request对象的列表(不要使用parse方法);
- follow: 一个布尔值,指定从response提取的链接是否需要跟进爬取(即进一步生成Request),如果不跟进,一般可以定义回调方法解析内容,生成Item。
在LinkExtractor中用到了一个参数:restrict_css
- restrict_css:表示从当前页面中与CSS选择器匹配的区域提取链接
- restrict_xpath:表示从当前页面中与XPath匹配的区域提取链接
- tags:指定从某个节点中提取链接,默认是('a','area')
- attrs:指定从节点的某个属性中提取链接,默认是('href',),搭配tags使用
- unique:是否需要对提取到的链接进行去重,默认是True
- strip:是否需要对提取到的结果进行去掉首尾空格的处理,默认是True
- allow:一个正则表达式(或列表),规定提取链接的白名单
- deny:一个正则表达式(或列表),规定提取链接的黑名单
- allow_domains:定义域名白名单
- deny_domains:定义域名黑名单
- deny_extensions:定义链接后缀黑名单(默认值包括7z、7zip、apk、dmg、ico、iso、tar等)
4.在爬虫中创建parse_detail方法,定义detail页中的爬取逻辑
-省略-
class MoiveSpider(CrawlSpider):
-省略-
def parse_detail(self, response):
item = MovieItem()
item['name'] = response.css('.item h2::text').get()
item['categories'] = response.css('.categories .category span::text').getall()
item['cover'] = response.css('.cover::attr(src)').get()
item['published_at'] = response.css('.info span::text').re_first('(\d{4}-\d{2}-\d{2})\s?上映')
item['score'] = response.css('.score::text').get().strip()
item['drama'] = response.css('.drama p::text').get().strip()
yield item
5.在items中定义MovieItem并指定好需要的字段
import scrapy
class MovieItem(scrapy.Item):
name = scrapy.Field