定义数据结构和多页爬取

定义数据结构

在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框架学习(五)定义数据结构和多页爬取的更多相关文章

  1. Scrapy框架爬虫初探——中关村在线手机参数数据爬取

    关于Scrapy如何安装部署的文章已经相当多了,但是网上实战的例子还不是很多,近来正好在学习该爬虫框架,就简单写了个Spider Demo来实践.作为硬件数码控,我选择了经常光顾的中关村在线的手机页面 ...

  2. (转)python爬虫----(scrapy框架提高(1),自定义Request爬取)

    摘要 之前一直使用默认的parse入口,以及SgmlLinkExtractor自动抓取url.但是一般使用的时候都是需要自己写具体的url抓取函数的. python 爬虫 scrapy scrapy提 ...

  3. Scrapy框架学习笔记

    1.Scrapy简介 Scrapy是用纯Python实现一个为了爬取网站数据.提取结构性数据而编写的应用框架,用途非常广泛. 框架的力量,用户只需要定制开发几个模块就可以轻松的实现一个爬虫,用来抓取网 ...

  4. 自己的Scrapy框架学习之路

    开始自己的Scrapy 框架学习之路. 一.Scrapy安装介绍 参考网上资料,先进行安装 使用pip来安装Scrapy 在开始菜单打开cmd命令行窗口执行如下命令即可 pip install Scr ...

  5. scrapy爬虫系列之二--翻页爬取及日志的基本用法

    功能点:如何翻页爬取信息,如何发送请求,日志的简单实用 爬取网站:腾讯社会招聘网 完整代码:https://files.cnblogs.com/files/bookwed/tencent.zip 主要 ...

  6. Scrapy框架学习(一)Scrapy框架介绍

    Scrapy框架的架构图如上. Scrapy中的数据流由引擎控制,数据流的过程如下: 1.Engine打开一个网站,找到处理该网站的Spider,并向该Spider请求第一个要爬取得URL. 2.En ...

  7. Scrapy 框架 (学习笔记-1)

    环境: 1.windows 10 2.Python 3.7 3.Scrapy 1.7.3 4.mysql 5.5.53 一.Scrapy 安装 1. Scrapy:是一套基于Twisted的一部处理框 ...

  8. Scrapy框架学习 - 使用内置的ImagesPipeline下载图片

    需求分析需求:爬取斗鱼主播图片,并下载到本地 思路: 使用Fiddler抓包工具,抓取斗鱼手机APP中的接口使用Scrapy框架的ImagesPipeline实现图片下载ImagesPipeline实 ...

  9. scrapy框架学习之路

    一.基础学习 - scrapy框架 介绍:大而全的爬虫组件. 安装: - Win: 下载:http://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted pip3 ...

  10. Scrapy框架学习(三)Spider、Downloader Middleware、Spider Middleware、Item Pipeline的用法

    Spider有以下属性: Spider属性 name 爬虫名称,定义Spider名字的字符串,必须是唯一的.常见的命名方法是以爬取网站的域名来命名,比如爬取baidu.com,那就将Spider的名字 ...

随机推荐

  1. ubuntu lnmp环境搭建 LNMP(Ubuntu 20.04 + Nginx + PHP 7.1 + Mysql5.7)

    转载csdn: ubuntu lnmp环境搭建 LNMP(Ubuntu 20.04 + Nginx + PHP 7.1 + Mysql5.7)_ts3211的博客-CSDN博客_lnmp环境搭建

  2. vue-fullpage全屏插件使用

    直入主题:vue项目中想做一个全屏翻滚的效果,vue-fullpage 就很不错 下面介绍vue-fullpage 的使用方法,这里封装成了vue的一个指令的形式来进行使用 1.安装vue-fullp ...

  3. LeetCode-1609 奇偶树

    来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/even-odd-tree 题目描述 如果一棵二叉树满足下述几个条件,则可以称为 奇偶树 : 二叉 ...

  4. chm文档生成->Sandcastle使用帮助

    1.介绍 Sandcastle是微软提供的开源的,用于生成.net文档帮助的工具. 源代码路径:https://github.com/EWSoftware/SHFB,进去后能找到Relase版本的路径 ...

  5. java学习日记20230225-java介绍

    sun公司 oak语言--java gosling >sun 1995 java第一个版本 2009年 甲骨文公司收购sun 2011 java7 2014 java8 2022-2030年 长 ...

  6. python笔记--在文件进行输出

    将print的内容输出到文件中 1 #将数据输出到文件中 2 fp=open('E:/text1.txt','a+') 3 print('hello word',file=fp) 4 fp.close ...

  7. 找出一组数中出现次数最多的数(csp201312-1)

    问题描述:找出一组数字出现次数最多的数,如果有多个这样的数,输出其中最小的一个. 算法:sort排序,遍历数组,每遍历一个数,查出它已经出现的次数. 代码: #include<bits/stdc ...

  8. LESS-8

    根据题目,这是一道布尔型注入.页面只有返回正常和不正常两种. payload: ' and substr(database(),1,1)='s' --+  判断当前数据库名的第一个字母,是's'页面就 ...

  9. iPhone添加节假日日历地址

    添加苹果节假日日历地址 手动订阅节假日: 打开"设置">"日历">"帐户">"添加帐户">&qu ...

  10. nginx热更新流程记录

    已经做过不止一次的nginx热更新了,之前都是按照别人的路子照葫芦画瓢,现在根据我在的项目单独写一个nginx热更新流程备份自用. nginx热升级流程上传新tar到/home/cp命令复制到/usr ...