scrapy框架学习(五)定义数据结构和多页爬取
定义数据结构和多页爬取
定义数据结构
在items.py文件中定义你要提取的内容(定义数据结构),比如我提取的内容为用户名name、用户头像链接face_src、好笑数funny、评论数comment,我就创建4个变量。Field方法实际上的做法是创建一个字典,给字典添加一个建,暂时不赋值,等待提取数据后再赋值。
#用户名
name=scrapy.Field()
#头像链接
face_src=scrapy.Field()
#好笑数
funny=scrapy.Field()
#评论数
comment=scrapy.Field()
在爬虫文件中使用定义好的数据结构存储数据
首先导入数据结构类
from myfirst_scrapyDemo.items import MyfirstScrapydemoItem
使用时类似字典的使用方式
item=MyfirstScrapydemoItem()
item['name']= name
item['face_src']=face_src
item['funny']=funny
item['comment']=comment
# Define here the models for your scraped items
#
# See documentation in:
# https://docs.scrapy.org/en/latest/topics/items.html import scrapy class MyfirstScrapydemoItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
#用户名
name=scrapy.Field()
#头像链接
face_src=scrapy.Field()
#好笑数
funny=scrapy.Field()
#评论数
comment=scrapy.Field()
import scrapy
from myfirst_scrapyDemo.items import MyfirstScrapydemoItem class SpiderQiushiSpider(scrapy.Spider):
#爬虫名字
name = 'spider_QiuShi'
#域名限制列表,列表值可以设置多个,限制爬虫只爬取该域名下的网页
allowed_domains = ['www.qiushibaike.com']
#初始爬取地址
start_urls = ['http://www.qiushibaike.com/text'] def parse(self, response):
div_list= response.xpath('//div[@class="col1 old-style-col1"]/div')
#items=[]
item=MyfirstScrapydemoItem()
for li in div_list:
# name= li.xpath('.//h2/text()')[0].extract().strip('\n').strip(' ')
# face_src= "https:"+li.xpath('.//div[1]/a[1]/img/@src')[0].extract().split('?')[0]
# funny= li.xpath('.//div[@class="stats"]/span[1]/i/text()')[0].extract()
# comment=li.xpath('.//div[@class="stats"]/span[2]/a/i/text()')[0].extract()
name= li.xpath('.//h2/text()').extract_first().strip('\n').strip(' ')
face_src= "https:"+li.xpath('.//div[1]/a[1]/img/@src').extract_first().split('?')[0]
funny= li.xpath('.//div[@class="stats"]/span[1]/i/text()').extract_first()
comment=li.xpath('.//div[@class="stats"]/span[2]/a/i/text()').extract_first()
# item= {
# "名称":name,
# "链接":face_src
# }
# items.append(item)
item['name']= name
item['face_src']=face_src
item['funny']=funny
item['comment']=comment
#print(item)
yield item
多页爬取
使用yield,将scrapy.Request(url)返回给引擎,引擎寻找调度器,并重新调用scrapy中的parse
程序里一共有两个yield,我比较喜欢叫它中断,当然中断只在CPU中发生,它的作用是移交控制权,在本程序中,我们对item封装数据后,就调用yield把控制权给管道,管道拿到处理后return返回,又回到该程序。这是对第一个yield的解释。
第二个yield稍微复杂点,这条程序里利用了一个回调机制,即callback,回调的对象是parse,也就是当前方法,通过不断的回调,程序将陷入循环,如果不给程序加条件,就会陷入死循环,如本程序我把if去掉,那就是死循环了。
yield scrapy.Request(url=url,callback=self.parse)
import scrapy
from myfirst_scrapyDemo.items import MyfirstScrapydemoItem class SpiderQiushiSpider(scrapy.Spider):
#爬虫名字
name = 'spider_QiuShi'
#域名限制列表,列表值可以设置多个,限制爬虫只爬取该域名下的网页
allowed_domains = ['www.qiushibaike.com']
#初始爬取地址
start_urls = ['http://www.qiushibaike.com/text'] #爬取多页
url='https://www.qiushibaike.com/text/page/{}/'
page=1 def parse(self, response):
div_list= response.xpath('//div[@class="col1 old-style-col1"]/div')
#items=[]
item=MyfirstScrapydemoItem()
for li in div_list:
# name= li.xpath('.//h2/text()')[0].extract().strip('\n').strip(' ')
# face_src= "https:"+li.xpath('.//div[1]/a[1]/img/@src')[0].extract().split('?')[0]
# funny= li.xpath('.//div[@class="stats"]/span[1]/i/text()')[0].extract()
# comment=li.xpath('.//div[@class="stats"]/span[2]/a/i/text()')[0].extract()
name= li.xpath('.//h2/text()').extract_first().strip('\n').strip(' ')
face_src= "https:"+li.xpath('.//div[1]/a[1]/img/@src').extract_first().split('?')[0]
funny= li.xpath('.//div[@class="stats"]/span[1]/i/text()').extract_first()
comment=li.xpath('.//div[@class="stats"]/span[2]/a/i/text()').extract_first()
# item= {
# "名称":name,
# "链接":face_src
# }
# items.append(item)
item['name']= name
item['face_src']=face_src
item['funny']=funny
item['comment']=comment
#print(item)
yield item #爬取多页
if self.page<6:
self.page+=1
url=self.url.format(self.page)
yield scrapy.Request(url=url,callback=self.parse)
scrapy框架学习(五)定义数据结构和多页爬取的更多相关文章
- Scrapy框架爬虫初探——中关村在线手机参数数据爬取
关于Scrapy如何安装部署的文章已经相当多了,但是网上实战的例子还不是很多,近来正好在学习该爬虫框架,就简单写了个Spider Demo来实践.作为硬件数码控,我选择了经常光顾的中关村在线的手机页面 ...
- (转)python爬虫----(scrapy框架提高(1),自定义Request爬取)
摘要 之前一直使用默认的parse入口,以及SgmlLinkExtractor自动抓取url.但是一般使用的时候都是需要自己写具体的url抓取函数的. python 爬虫 scrapy scrapy提 ...
- Scrapy框架学习笔记
1.Scrapy简介 Scrapy是用纯Python实现一个为了爬取网站数据.提取结构性数据而编写的应用框架,用途非常广泛. 框架的力量,用户只需要定制开发几个模块就可以轻松的实现一个爬虫,用来抓取网 ...
- 自己的Scrapy框架学习之路
开始自己的Scrapy 框架学习之路. 一.Scrapy安装介绍 参考网上资料,先进行安装 使用pip来安装Scrapy 在开始菜单打开cmd命令行窗口执行如下命令即可 pip install Scr ...
- scrapy爬虫系列之二--翻页爬取及日志的基本用法
功能点:如何翻页爬取信息,如何发送请求,日志的简单实用 爬取网站:腾讯社会招聘网 完整代码:https://files.cnblogs.com/files/bookwed/tencent.zip 主要 ...
- Scrapy框架学习(一)Scrapy框架介绍
Scrapy框架的架构图如上. Scrapy中的数据流由引擎控制,数据流的过程如下: 1.Engine打开一个网站,找到处理该网站的Spider,并向该Spider请求第一个要爬取得URL. 2.En ...
- Scrapy 框架 (学习笔记-1)
环境: 1.windows 10 2.Python 3.7 3.Scrapy 1.7.3 4.mysql 5.5.53 一.Scrapy 安装 1. Scrapy:是一套基于Twisted的一部处理框 ...
- Scrapy框架学习 - 使用内置的ImagesPipeline下载图片
需求分析需求:爬取斗鱼主播图片,并下载到本地 思路: 使用Fiddler抓包工具,抓取斗鱼手机APP中的接口使用Scrapy框架的ImagesPipeline实现图片下载ImagesPipeline实 ...
- scrapy框架学习之路
一.基础学习 - scrapy框架 介绍:大而全的爬虫组件. 安装: - Win: 下载:http://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted pip3 ...
- Scrapy框架学习(三)Spider、Downloader Middleware、Spider Middleware、Item Pipeline的用法
Spider有以下属性: Spider属性 name 爬虫名称,定义Spider名字的字符串,必须是唯一的.常见的命名方法是以爬取网站的域名来命名,比如爬取baidu.com,那就将Spider的名字 ...
随机推荐
- 代码随想录算法训练营day22 | leetcode 235. 二叉搜索树的最近公共祖先 ● 701.二叉搜索树中的插入操作 ● 450.删除二叉搜索树中的节点
LeetCode 235. 二叉搜索树的最近公共祖先 分析1.0 二叉搜索树根节点元素值大小介于子树之间,所以只要找到第一个介于他俩之间的节点就行 class Solution { public T ...
- webserver 简单demo
以调用天气服务为例: 1.添加服务引用 2.点窗口做下角(高级->添加web引用->URL输入框输入天气服务地址(http://www.webxml.com.cn/WebServices/ ...
- LeetCode算法训练 93.复原IP地址 78.子集 90.子集II
欢迎关注个人公众号:爱喝可可牛奶 LeetCode算法训练 93.复原IP地址 78.子集 90.子集II LeetCode 93. 复原 IP 地址 分析 字符串全部由数字组成,ipv4每一段数字不 ...
- OpenLayers点聚合
1. 引言 当页面加载的数据量过大时,拖拽.缩放时往往会产生卡顿 然而,页面实现的内容是有限的,人眼可见范围也是有限的,过于微小的部分是可以不予显示的 聚合是解决这种问题的一个办法,当数据比较多,单个 ...
- PostgreSQL控制文件讲解及案例
PostgreSQL控制文件内容: 主要分为是三部分,初始化静态信息.WAL及检查点的动态信息.一些配置信息. 我们可以用过pg_controldata命令直接读取PostgreSQL控制文件内容: ...
- 看完这一篇,ShardingSphere-jdbc 实战再也不怕了
谈到分库分表中间件时,我们自然而然的会想到 ShardingSphere-JDBC . 这篇文章,我们聊聊 ShardingSphere-JDBC 相关知识点,并实战演示一番. 1 ShardingS ...
- 一文搞懂│http 和 https 的通信过程及区别
目录 两者的区别 HTTP的通信过程 HTTPS的通信过程 两者的区别 端口: http 端口号是80,https 端口号是443 传输协议: http 是超文本传输协议,属于明文传输:https 是 ...
- Vue框架中有关 computed的相关知识
1,传统使用computed属性的方式如下: 注意:此时如果我们点击修改的时候会有如下警告(表示computed属性不可以修改,如果非得修改,我们应该如下下图所示操作) 2,修改computed属性的 ...
- 在grafana中使用不同的数据源及插件安装
一.postgresql作为数据源 现在PG的版本是10.5(10+) 加入datasource 时只能指定一个数据库,对于监控来说可使用默认数据库postgres! 可以方便地作趋势图以及使用tab ...
- UIAutomator API定位元素
一.根据class name和text属性 包名不可省略 code= new UiSelector().text("我的").classname("android.wi ...