Scrapy(五):CrawlSpider的使用
Scrapy(五):CrawlSpider的使用
说明 :CrawlSpider,就是一个类,是Spider的一个子类,也是一个官方类,因为是子类,所以功能更加的强大,多了一项功能:去指定的页面中来抓取指定的url的功能
比如:很多页码,都需要自己去查找规律,然后写代码实现其它页面的爬取,学完crawlspider之后,可以让它直接提取符合要求的页码url,将这些url扔给调度器即可
链接提取器,在scrapy中就是一个类,LinkExtractor
一、创建项目:
scrapy startproject qiubaiproject
二、创建CrawlSpider爬虫文件
scrapy genspider -t crawl qiu 'www.qiushibaike.com'
三、书写spider文件
# -*- coding: utf-8 -*-
"""
field: qiu.py
"""
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from qiubaiproject.items import QiubaiprojectItem
class QiuSpider(CrawlSpider):
name = 'qiu'
allowed_domains = ['www.qiushibaike.com']
start_urls = ['http://www.qiushibaike.com/']
# 【注】如果使用crawlspider,parse方法不能重写,因为内部实现了很重要的功能
page_link = LinkExtractor(allow=r'/8hr/page/\d+/')
"""
在创建对象的时候,需要使用到一些规则,符合规则的都会提取出来
scrapy.linkextractors.LinkExtractor(
allow = (), # 正则表达式
deny = (), # 正则表达式(不经常使用)
allow_domains = (), # 域名,在域名下的提取出来(不经常使用)
deny_domains = (), # 在这些下面的不要提取(不经常使用)
restrict_xpaths = (), # 根据xpath路径来提取符合要求的链接
restrict_css = () # 根据选择器来提取
callback: 定制处理响应的回调函数, 注意callback的写法,和普通spider的写法不一样,普通 callback=self.parse
crawl: callback='parse_item'
follow: 是否跟进,提取了这些链接,这些链接获得响应之后,在响应里面要不要接着提取链接发送请求,如果要,follow=True 如果不要,follow=False
follow是有默认值的,如果有callback,默认为False,如果没有callback,默认为True
)
"""
rules = (
Rule(page_link, callback='parse_item', follow=True),
)
def parse_item(self, response):
# 先找到所有的div
div_list = response.xpath('//div[@id="content-left"]/div')
# 遍历这个div的列表,依次获取里面的每一条信息
for odiv in div_list:
# 创建对象
item = QiubaiprojectItem()
# 用户头像
face = 'https:' + odiv.xpath('.//div[1]//img/@src')[0].extract()
# 用户的名字
name = odiv.xpath('.//div[1]//h2').extract()[0]
# 用户的年龄
age = odiv.xpath('.//div[starts-with(@class,"articleGender")]').extract_first()
# 获取用户内容
ospan = odiv.xpath('.//div[@class="content"]/span[1]')[0]
content = ospan.xpath('string(.)').extract()
# 用户的好笑个数
haha_count = odiv.xpath('.//div[@class="stats"]/span[@class="stats-vote"]/i/text()').extract()[0]
# 获取评论个数
ping_count = odiv.xpath('.//div[@class="stats"]/span[@class="stats-comments"]//i/text()').extract()[0]
# 将提取的信息保存起来
item['image_src'] = face
item['name'] = name
item['age'] = age
item['content'] = content
item['haha_count'] = haha_count
item['ping_count'] = ping_count
yield item
四、书写item.py文件
# -*- coding: utf-8 -*-
# Define here the models for your scraped items
#
# See documentation in:
# https://docs.scrapy.org/en/latest/topics/items.html
import scrapy
class QiubaiprojectItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
# 图片链接
image_src = scrapy.Field()
# 用户名
name = scrapy.Field()
# 年龄
age = scrapy.Field()
# 内容
content = scrapy.Field()
# 好笑个数
haha_count = scrapy.Field()
# 评论个数
ping_count = scrapy.Field()
五、书写管道文件
# -*- coding: utf-8 -*-
# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html
import json
class QiubaiprojectPipeline(object):
# 爬虫启动的时候只会调用一次
def open_spider(self, spider):
# 将文件的打开写道这里
self.fp = open('qiubai.json', 'w', encoding='utf8')
# 这个函数就是处理item的函数,每一个item过来都会回调这个方法
def process_item(self, item, spider):
# 将对象转化为字典
obj = dict(item)
# 将字典转化为json格式字符串
string = json.dumps(obj, ensure_ascii=False)
self.fp.write(string + '\n')
return item
# 爬虫结束的时候回调这个方法
def close_spider(self, spider):
self.fp.close()
六、修改setting文件
ROBOTSTXT_OBEY = True
DOWNLOAD_DELAY = 4 #防止爬取过快丢失数据
DEFAULT_REQUEST_HEADERS = {
"User-Agent" : "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0;",
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'
}
ITEM_PIPELINES = {
'tencent.pipelines.TencentPipeline': 300,
}
七、运行爬虫程序
scrapy crawl qiu
Scrapy(五):CrawlSpider的使用的更多相关文章
- python爬虫之Scrapy框架(CrawlSpider)
提问:如果想要通过爬虫程序去爬取”糗百“全站数据新闻数据的话,有几种实现方法? 方法一:基于Scrapy框架中的Spider的递归爬去进行实现的(Request模块回调) 方法二:基于CrawlSpi ...
- scrapy——3 crawlSpider——爱问
scrapy——3 crawlSpider crawlSpider 爬取一般网站常用的爬虫类.其定义了一些规则(rule)来提供跟进link的方便的机制. 也许该spider并不是完全适合您的特定网 ...
- python框架Scrapy中crawlSpider的使用——爬取内容写进MySQL
一.先在MySQL中创建test数据库,和相应的site数据表 二.创建Scrapy工程 #scrapy startproject 工程名 scrapy startproject demo4 三.进入 ...
- python框架Scrapy中crawlSpider的使用
一.创建Scrapy工程 #scrapy startproject 工程名 scrapy startproject demo3 二.进入工程目录,根据爬虫模板生成爬虫文件 #scrapy genspi ...
- Scrapy框架-CrawlSpider
目录 1.CrawlSpider介绍 2.CrawlSpider源代码 3. LinkExtractors:提取Response中的链接 4. Rules 5.重写Tencent爬虫 6. Spide ...
- scrapy 中crawlspider 爬虫
爬取目标网站: http://www.chinanews.com/rss/rss_2.html 获取url后进入另一个页面进行数据提取 检查网页: 爬虫该页数据的逻辑: Crawlspider爬虫类: ...
- Scrapy 框架 CrawlSpider 全站数据爬取
CrawlSpider 全站数据爬取 创建 crawlSpider 爬虫文件 scrapy genspider -t crawl chouti www.xxx.com import scrapy fr ...
- Scrapy 使用CrawlSpider整站抓取文章内容实现
刚接触Scrapy框架,不是很熟悉,之前用webdriver+selenium实现过头条的抓取,但是感觉对于整站抓取,之前的这种用无GUI的浏览器方式,效率不够高,所以尝试用CrawlSpider来实 ...
- 全栈爬取-Scrapy框架(CrawlSpider)
引入 提问:如果想要通过爬虫程序去爬取”糗百“全站数据新闻数据的话,有几种实现方法? 方法一:基于Scrapy框架中的Spider的递归爬取进行实现(Request模块递归回调parse方法). 方法 ...
- Scrapy框架——CrawlSpider类爬虫案例
Scrapy--CrawlSpider Scrapy框架中分两类爬虫,Spider类和CrawlSpider类. 此案例采用的是CrawlSpider类实现爬虫. 它是Spider的派生类,Spide ...
随机推荐
- 【php】 jsonp转数组函数jsonp_decode
分享一个可以跟json一样用的函数jsonp_decode,能把jsonp格式数据转为php数组或对象. /** * 把jsonp转为php数组 * @param string $jsonp js ...
- Nice Jquery Validator 自定义规则
规则定义方式 (1). 正则 适用于使用单个正则能搞定的验证. // 使用数组包裹正则和错误消息,规则不通过时提示该消息 mobile: [/^1[3458]\d{9}$/, '请检查手机号格式'] ...
- 有趣的 Canvas
canvas动画狗:https://www.jianshu.com/p/7873307147d5
- @bzoj - 3148@ 没头脑和不高兴
目录 @description@ @solution@ @part 1:期望@ @part 2:方差@ @accepted code@ @details@ @description@ 没头脑和不高兴是 ...
- Keiichi Tsuchiya the Drift King (c++三角函数公式)【几何+三角函数公式】
Keiichi Tsuchiya the Drift King 感谢: https://blog.csdn.net/xiao_you_you/article/details/89357815 题目链 ...
- 将MySQL库的表转入到MSSQL中的某个库中(Employees下的Employees表 → pubs库下)_2
将MySQL库的表转入到MSSQL中的某个库中(Employees下的Employees表 → pubs库下, 此pubs下的表名是employee,不冲突),方法大致以下几个(另有其他方法待补充), ...
- numpy中数组(矩阵)的乘法
我们知道在处理数据的时候,使用矩阵间的运算将会是方便直观的.matlab有先天的优势,算矩阵是它的专长.当然我们用python,经常要用到的可能是numpy这个强大的库. 矩阵有两种乘法,点乘和对应项 ...
- .NET进行客户端Web开发又一利器 - Ant Design Blazor
你好,我是Dotnet9,继上篇介绍Bootstrap风格的BlazorUI组件库后,今天我来介绍另一款Blazor UI组件库:一套基于 Ant Design 和 Blazor 的企业级组件库. 本 ...
- package.json 文件说明:
package.json 文件属性说明: name - 包名. version - 包的版本号. description - 包的描述. homepage - 包的官网 url . author - ...
- 一个非侵入的Go事务管理库——工作原理
在上一篇文章"一个非侵入的Go事务管理库--如何使用"中,我讲述了如何使用事务库.有些读者可能读过"清晰架构(Clean Architecture)的Go微服务: 事物管 ...