Scrapy 命令
安装
创建/运行
创建项目
1
| scrapy startproject projectName
|
项目 tree
1 2 3 4 5 6 7 8 9 10 11
| ├── scrapy.cfg 项目的配置文件 └── zhihu 该项目的python模块。之后您将在此加入代码 ├── __init__.py ├── items.py 项目中的 item 文件. ├── middlewares.py ├── pipelines.py ├── __pycache__ ├── settings.py 项目的设置文件 └── spiders 放置 spider 代码的目录 ├── __init__.py └── __pycache__
|
创建新的 spider
1
| scrapy genspider mydomain mydomain.com
|
运行
项目操作
1 2 3 4 5 6 7 8 9 10
| scrapy crawl zhihu scrapy check [-l] <zhihu> scrapy list scrapy edit <zhihu> scrapy fetch url scrapy fetch --nolog url scrapy fetch --nolog --no-redirect url scrapy view url scrapy shell scrapy crawl user -o items.json
|
选择器
网页源码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| <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>
|
交互模式下
1
| crapy shell https://doc.scrapy.org/en/latest/_static/selectors-sample1.html
|
- 构建一个选择器来选择title标签内的文本
1 2 3 4 5 6 7
| response.selector.xpath('//title/text()')
response.xpath('//title/text()')
response.css('title::text')
|
提取文本数据,必须调用selector .extract() 方法
1 2
| response.xpath('//title/text()').extract() response.css('title::text').extract_first()
|
- 获取属性
1 2 3 4 5
| response.xpath('//a/Ahref').extract() response.css('a::attr(href)').extract()
response.css('img').xpath('@src').extract() response.xpath('//div[@id="images"]/a/text()').extract_first()
|
default 默认返回值作为参数
1
| response.xpath('//div[@id="not-exists"]/text()').extract_first(default='not-found')
|
- 获取文本内容
1 2
| response.xpath('//a/text()').extract() response.css('a::text()').estract()
|
- 模糊查找(属性名包含)
1 2 3 4 5 6 7
| response.xpath('//a[contains(@href,"image")]/@href').extract() response.css('a[href* = image]::attr(href)').extract()
response.xpath("//a[contains(@href,'image')]/img/@src").extract() response.css('a[href* = image] img::attr(src)').extract()
|
嵌套选择器
- xpath,css
1 2 3 4 5
| links = response.xpath('//a[contains(@href, "image")]') links.extract() for index, link in enumerate(links): args = (index, link.xpath('@href').extract(), link.xpath('img/@src').extract()) print 'Link number %d points to url %s and image %s' % args
|
具有正则表达式的选择器
1 2 3 4 5 6 7 8 9
| response.css('a::text').re('Name\:(.*)') response.css('a::text').re_first('Name\:(.*)') response.css('a::text').re_first('Name\:(.*)').strip()
response.xpath('//a[contains(@href, "image")]/text()').re(r'Name:\s*(.*)')
response.xpath('//a[contains(@href, "image")]/text()').re_first(r'Name:\s*(.*)')
|
定义 Item
Item 是保存爬取到的数据的容器;其使用方法和python字典类似.
- 编辑 tutorial 目录中的 items.py 文件:
1 2 3 4 5 6
| import scrapy
class DmozItem(scrapy.Item): title = scrapy.Field() link = scrapy.Field() desc = scrapy.Field()
|
官方文档