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 ...
随机推荐
- node.js vue开发环境搭建
开发工具安装 1.安装node.js 双击安装程序 node-v8.9.3-x64.msi,进行安装即可 2.设置taobao镜像 npm config set registry https://re ...
- Dedecms中{dede:type}标签支持调用父级栏目名称
需求: 我们用{dede:type}标签调用栏目相关内容时,同时需要调用该栏目的父级栏目的名称. {dede:type}标签的代码做了一下开发,支持这个调用了. 开发方法: 1.打开include/t ...
- abp-CMS模块-广告
无论是开发app还是网站,可能都需要一个广告功能,比如我们常见的在首页有个轮播广告,里面会轮播显示多个图片.还有比如一个新闻门户网站 很常见的 banner横幅广告,还有js特效广告等.本篇说说在ab ...
- @bzoj - 3724@ PA2014Final Krolestwo
目录 @description@ @solution@ @accepted code@ @details@ @description@ 你有一个无向连通图,边的总数为偶数. 设图中有k个奇点(度数为奇 ...
- Java_图片转字符
把高达头像转换成字符[-V-] 调节双循环里y与x的增量改变字符输出的细节.高和长 public class ImgToStr { public static void main(String arg ...
- idea出现 淇℃伅 乱码
问题:我是idea出现 淇℃伅 乱码, 解决:修改 tomcat 下的 logging.properties这个文件 为 GBK 就好了. 参考:https://blog.csdn.net/weixi ...
- DS-4-单链表的各种插入与删除的实现
typedef struct LNode { int data; struct LNode *next; }LNode, *LinkList; 带头结点的按位序插入: //在第i个位置插入元素e bo ...
- Android学习笔记菜单资源文件
创建菜单资源 menu_one.xml <?xml version="1.0" encoding="utf-8"?> <menu xmlns: ...
- mapper.xml文件映射配置
一.导入约束 为全局配置文件绑定dtd约束: 1)联网会自动绑定 2)没网的时候[/org/apache/ibatis/builder/xml/mybatis-3-mapper.dtd]:解压myba ...
- Java Jar 包加密 -- XJar
Java Jar 包加密 一.缘由 Java的 Jar包中的.class文件可以通过反汇编得到源码.这样一款应用的安全性就很难得到保证,别人只要得到你的应用,不需花费什么力气,就可以得到源码. 这时候 ...