定义数据结构和多页爬取

定义数据结构

在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. 代码随想录-day2

    哈希表 基础知识 哈希表和链表都是属于基础数据结构的一种,都是必须掌握牢靠的知识. 哈希表是根据关键码的值而直接进行访问的数据结构. 简单来说就是使用数据得到的哈希值来作为哈希表的key用于获取数据. ...

  2. 记一次hooks陷阱

    今天写一个hook,正想发挥hooks这种高级复用方式来缩短我的开发时间,就出现了一个新bug. 我编写的这个hook用于管理数据列表状态.除了导出内部的状态外,还导出一些方法供外部调用.代码简化如下 ...

  3. Android 删除已知路径的文件或文件夹

    转载:https://blog.csdn.net/qq_31939617/article/details/89414714[功能]delete(String delFile):删除文件或文件夹 del ...

  4. No.1.8

    定位 网页常见布局 标准流(块级元素独占一行-->垂直布局,行内元素/行内块元素一行显示多个-->水平布局) 浮动(可以让原本垂直布局的块级元素变成水平布局) 定位(可以让元素自由的摆放在 ...

  5. 关于hbulider开发工具微信小程序请求跨域

    问题描述: 1.thinkphp设置了跨域请求设置 2.接口在浏览器模式正常请求 3.微信小程序请求显示跨域 解决方案:

  6. JavaScrip 学习笔记

    <script> $().ready(function () { // 在键盘按下并释放及提交后验证提交表单 $("#form1").validate({ errorE ...

  7. .Net Core Elasticsearch 时间查询问题

    查询时增加条件需要设置时区,这样时间才不会出现问题. new QueryContainerDescriptor<T>().DateRange(t => t.Field(f => ...

  8. flask相关

    app使用flask_session pip install flask_session from flask_session import Session app = Flask(__name__) ...

  9. 不用VS,使用NET 7.0 SDK (v7.0.101)编程c#控制台应用程序方法

    摘要:如果没有vs环境,也可以编程c#控制台应用程序学习c#,方法步骤有下面几个步骤. 1.下载NET 7.0 SDK (v7.0.101)安装 网址https://dotnet.microsoft. ...

  10. c++练习267题 火柴棒等式

    *267题 原题传送门:http://oj.tfls.net/p/267 题解: #include<bits/stdc++.h>using namespace std;int c,m;in ...