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的名字 ...
随机推荐
- 病程极短(≤16周)的495例未分化关节炎患者随访2年的结局[EULAR2015_SAT0055]
病程极短(≤16周)的495例未分化关节炎患者随访2年的结局 SAT0055 TWO-YEAR OUTCOME IN 495 PATIENTS WITH UNDIFFERENTIATED ARTH ...
- CSS less转CSS
less 转css代码格式cmd命令: lessc D:\workspace\ipad\index.less D:\workspace\ipad\index.css
- windows pwn(一)
前言 前几天因为看CS shellcode装了一个win10虚拟机,然后正好因为逆向课老师要装一系列工具.于是就想起来之前一直想看的windows pwn,就顺便装了一下相关工具并且入门了一下. 工具 ...
- Vitis-AI之docker指南
由于网络原因,有时候进入docker官网时候很卡,故摘录一部分安装要点,供自己查阅参考 docker安装原文链接:https://docs.docker.com/engine/install/ubun ...
- autodesk2023全家桶 Autodesk 2023 所有产品下载地址
autodesk2023全家桶 Autodesk 2023 所有产品下载地址 作者: 佚名 2022/4/10 11:51:24 Autodesk系列软件每年都会提前发布,目前autodesk2023 ...
- STM32 I2C介绍和软件模拟I2C编程要点
I2C协议层独特特征: 1. 通过地址(Master/Slave Address)区分不同的设备. 2. ACK信号体制,即通过ACK表示是否进行继续传输. 3.由SCL.SDA的四种关系,映射数据有 ...
- adb的详解
1.何为adb adb(Android Debug Bridge)是android sdk的一个工具 adb是用来连接安卓手机和pc端的桥梁,要有adb作为二者之间的维系,才能让用户在电脑上对手机进行 ...
- N63050 第二周运维作业
1.显示/etc目录下,以非字母开头,后面跟了一个字母以及其它任意长度任意字符的文件或目录 1 [root@centos8 etc]#touch 5a.txt 9a.txt 2 [root@cento ...
- 如何删除Word文档中的空白页
需求 平常我们写 Office 文档的时候,经常会不小心多加几页空白,那么如何删除 word 文档中的空白页呢? 小编结合网友提供的办法和亲身测试的操作经验,给大家提供几个可行的方案. 原文:如何删除 ...
- spring-boot logback 日志
一.引入依赖 二.配置日志文件 三.完事啦!