安装 scrapy
不同操作系统安装操作不同,可以直接看官方文档 Install Scrapy
创建一个项目
在命令行输入
scrapy startproject tutorial
进入项目目录创建一个 spider
cd tutorial
scrapy genspider quotes domain.com
import scrapy
class QuotesSpider(scrapy.Spider):
name = “quotes”
def start_requests(self):
urls = [
‘http://quotes.toscrape.com/page/1/’,
‘http://quotes.toscrape.com/page/2/’,
]
for url in urls:
yield scrapy.Request(url=url, callback=self.parse)
def parse(self, response):
page = response.url.split(“/”)[-2]
filename = ‘quotes-%s.html’ % page
with open(filename, ‘wb’) as f:
f.write(response.body)
self.log(‘Saved file %s’ % filename)
运行 scrapy,在项目顶级目录下输入命令
scrapy crawl quotes
在 QuotesSpider 这个类里,name 指明 spider 的名称,在 start_requests 函数里发出请求,用 parse 函数处理请求返回的结果,start_requests 函数可以替换为 start_urls 列表,scrapy 会自动帮我们发出请求,并默认用 parse 函数处理,还可以设置一些其它参数,详见 Document
选择器用法
scrapy 内置 css 选择器和 xpath 选择器,当然你也可以选择使用其他的解析库,比如 BeautifulSoup,我们简单用 scrapy shell 展示一下 scrapy 内置选择器的用法,在命令行中输入
scrapy shell https://docs.scrapy.org/en/latest/_static/selectors-sample1.html
示例代码
<html>
<head>
<base href=’http://example.com/’ />
<title>Example website</title>
</head>
<body>
<div id=’images’>
<a href=’image1.html’>Name: My image 1 <br /><img src=’image1_thumb.jpg’ /></a>
<a href=’image2.html’>Name: My image 2 <br /><img src=’image2_thumb.jpg’ /></a>
<a href=’image3.html’>Name: My image 3 <br /><img src=’image3_thumb.jpg’ /></a>
<a href=’image4.html’>Name: My image 4 <br /><img src=’image4_thumb.jpg’ /></a>
<a href=’image5.html’>Name: My image 5 <br /><img src=’image5_thumb.jpg’ /></a>
</div>
</body>
</html>
# 获取标题
# selector 可以去掉
# extract 返回的是列表
response.selector.xpath(‘//title/text()’).extract_first()
response.selector.css(‘title::text’).extract_first()
# 获取 a 标签里 href 参数内容
response.xpath(‘//a/@href’).extract()
response.css(‘a::attr(href)’).extract()
# 混合获取 img 标签的 src 属性
response.xpath(‘//div[@id=”images”]’).css(‘img::attr(src)’).extract()
# 获取 a 标签中包含 image 的 href 属性
response.xpath(‘//a[contains(@href, “image”)]/@href’).extract()
response.css(‘a[href*=image]::attr(href)’).extract()
# 使用正则表达式
response.css(‘a::text’).re(‘Name\:(.*)’)
response.css(‘a::text’).re_first(‘Name\:(.*)’)
# 添加 default 参数指定默认提取信息
response.css(‘aa’).extract_first(default=”)
Item Pipeline 用法
通过 parse 处理函数返回的 Item 可以用 Item Pipeline 进行加工处理,主要是数据清洗,格式化。
# 过滤掉相同的 item
class DuplicatePipeline(object):
def __init__(self):
self.items = set()
def process_item(self, item, spider):
if item[‘id’] in self.items:
raise DropItem(‘Duplicate item found: %s’ % item[‘id’])
else:
self.items.add(item[‘id’])
return item
需要在 settings 里的注册一下自定义的 Pipeline
ITEM_PIPELINES = {
‘tutorial.pipelines.TutorialPipeline’: 300,
‘tutorial.pipelines.DuplicatePipeline’: 200,
}
数字越小,优先级越高