博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Scrapy基本用法
阅读量:5885 次
发布时间:2019-06-19

本文共 2381 字,大约阅读时间需要 7 分钟。

安装scrapy

不同操作系统安装操作不同,可以直接看官方文档

创建一个项目

在命令行输入

scrapy startproject tutorial

进入项目目录创建一个spider

cd tutorialscrapy genspider quotes domain.com
import scrapyclass 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函数处理,还可以设置一些其它参数,详见

选择器用法

scrapy内置css选择器和xpath选择器,当然你也可以选择使用其他的解析库,比如BeautifulSoup,我们简单用scrapy shell展示一下scrapy内置选择器的用法,在命令行中输入

scrapy shell https://docs.scrapy.org/en/latest/_static/selectors-sample1.html

示例代码

     Example website    
# 获取标题# 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进行加工处理,主要是数据清洗,格式化。

# 过滤掉相同的itemclass 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,}

数字越小,优先级越高

转载地址:http://xhlix.baihongyu.com/

你可能感兴趣的文章
如何使用Core Text计算一段文本绘制在屏幕上之后的高度
查看>>
2010技术应用计划
查看>>
Winform开发框架之权限管理系统改进的经验总结(3)-系统登录黑白名单的实现...
查看>>
JavaScript高级程序设计--对象,数组(栈方法,队列方法,重排序方法,迭代方法)...
查看>>
【转】 学习ios(必看经典)牛人40天精通iOS开发的学习方法【2015.12.2
查看>>
在 ASP.NET MVC 中使用异步控制器
查看>>
SQL语句的执行过程
查看>>
详解Linux中Load average负载
查看>>
PHP遍历文件夹及子文件夹所有文件
查看>>
WinForm程序中两份mdf文件问题的解决
查看>>
程序计数器、反汇编工具
查看>>
Android N: jack server failed
查看>>
如何将lotus 通讯簿导入到outlook 2003中
查看>>
WinForm 应用程序中开启新的进程及控制
查看>>
js replace,正则截取字符串内容
查看>>
Thinkphp5笔记三:创建基类
查看>>
查询反模式 - GroupBy、HAVING的理解
查看>>
Android中EditText,Button等控件的设置
查看>>
TextKit简单示例
查看>>
网格最短路径算法(Dijkstra & Fast Marching)(转)
查看>>