[Python Scrapy爬虫] 二.翻页爬取农产品信息并保存本地

2023-11-04

前面 "Python爬虫之Selenium+Phantomjs+CasperJS" 介绍了很多Selenium基于自动测试的Python爬虫程序,主要利用它的xpath语句,通过分析网页DOM树结构进行爬取内容,同时可以结合Phantomjs模拟浏览器进行鼠标或键盘操作。但是,更为广泛使用的Python爬虫框架是——Scrapy爬虫。这篇文章是一篇基础文章,主要内容包括:

    1.Scrapy爬取贵州农产品的详细步骤;
    2.Scrapy如何将数据存储至Json或CSV文件中;
    3.Scrapy实现三种翻页方法爬取农产品数据。

下面提供前面的一些相关文章:

    官方 Scrapy  : http://scrapy.org/
    官方英文文档: http://doc.scrapy.org/en/latest/index.html
    官方中文文档: https://scrapy-chs.readthedocs.org/zh_CN/0.24/index.html

    入门安装知识: [Python爬虫] scrapy爬虫系列 <一>.安装及入门介绍
  BeautifulSoup:[python爬虫] BeautifulSoup爬取+CSV存储贵州农产品数据


在做数据分析时,通常会遇到预测商品价格的情况,而在预测价格之前需要爬取海量的商品价格信息,比如淘宝、京东商品等,这里作者采用Scrapy技术爬取贵州农产品数据集。

输入 "http://www.gznw.gov.cn/priceInfo/getPriceInfoByAreaId.jx?areaid=22572&page=1网址,打开贵州农经网,可以查看贵州各个地区农产品每天价格的波动情况,如下图所示,主要包括五个字段:品种名称、价格、计量单位、所在市场、上传时间。


Scrapy框架自定义爬虫主要步骤如下:

  • 在CMD命令行模型下创建爬虫工程,即创建GZProject工程爬取贵州农经网。
  • 在items.py文件中定义我们要抓取的数据栏目,对应商品名称、价格、计量单位等五个字段。
  • 通过浏览器审查元素功能分析所需爬取内容的DOM结构并定位HTML节点。
  • 创建Spiders爬虫文件,定位并爬取所需内容。
  • 分析网页翻页方法,并发送多页面跳转爬取请求,不断执行Spiders爬虫直到结束。
  • 设置pipelines.py文件,将爬取的数据集存储至本地Json文件或CSV文件中。
  • 设置settings.py文件,设置爬虫的执行优先级。

下面是完整的实现过程,重点知识是如何实现翻页爬取及多页面爬取,希望对您有帮助。




一. 创建工程

在Windows环境下,我们调用“Ctrl+R”快捷键打开运行对话框,然后输出“cmd”命令打开命令行模式,然后调用“cd”命令去到某个目录下,再调用“scrapy startproject GZProject”命令创建爬取贵州农经网产品信息的爬虫工程。

创建Scrapy爬虫

scrapy startproject GZProject

在本地C盘根目录创建的GZProject工程目录如下图所示,包括常见的文件,如items.py、middlewares.py、pipelines.py、settings.py以及文件夹spiders等。




二. 设置items文件

接在我们需要在items.py文件中定义需要爬取的字段,这里主要是五个字段,调用scrapy.item子类的 Field()函数创建字段,代码如下所示。



items.py文件的代码如下:

# -*- coding: utf-8 -*-

# Define here the models for your scraped items
#
# See documentation in:
# http://doc.scrapy.org/en/latest/topics/items.html

import scrapy

class GzprojectItem(scrapy.Item):
    num1 = scrapy.Field()           #品种名称
    num2 = scrapy.Field()           #价格
    num3 = scrapy.Field()           #计量单位
    num4 = scrapy.Field()           #所在市场
    num5 = scrapy.Field()           #上传时间

接下来就是核心内容,通过分析网页DOM结构并编写对应Spiders爬虫代码。




三. 浏览器审查元素

打开任意浏览器,然后调用“审查元素”或“检查”功能(该功能在不同浏览器中称呼不同,但功能都是相似的)查看所需爬取内容的HTML源代码,比如Chrome浏览器定位方法如图13.21所示。选中需要爬取元素,然后右键鼠标,点击“检查”按钮,可以看到元素对应的HTML源代码,比如图中的右边部分。



通过审查元素功能,我们可以发现每行数据都位于<tr>节点下,其class属性为“odd gradeX”,如图13.22所示,接着调用scrapy框架的xpath、css等功能进行爬取。




四. 创建Spiders爬虫并执行

然后在spiders文件夹下创建一个Python文件,主要用于实现Spider爬虫代码,创建GZSpider.py文件,工程目录如下图所示。




增加代码如下所示,在GZSpider类中定义了爬虫名(name)为“gznw”,同时代码中allowed_domains表示所爬取网址的跟地址,start_urls表示开始爬取的网页地址,然后调用parse()函数进行爬取,这里首先爬取该网友的标题,通过response.xpath('//title')函数实现。代码如图所示:



GZSpider.py

# -*- coding: utf-8 -*-
import scrapy

class GZSpider(scrapy.Spider):
    name = "gznw"                #贵州农产品爬虫
    allowed_domains = ["gznw.gov.cn"]
    start_urls = [
     "http://www.gznw.gov.cn/priceInfo/getPriceInfoByAreaId.jx?areaid=22572&page=1"
    ]

    def parse(self, response):
        for t in response.xpath('//title'):
            title = t.extract()
            print title
        for t in response.xpath('//title/text()'):
            title = t.extract()
            print title 

接下来进入C工程目录,执行下列命令启动Spider爬虫。

cd GZProject
scrapy crawl gznw

"scrapy crawl gznw"启动Spider爬虫,爬取贵州农经网商品,运行如图所示。程序开始运行,自动使用start_urls构造Request并发送请求,然后调用parse()函数对其进行解析,在这个解析过程中可能会通过链接再次生成Request,如此不断循环,直到返回的文本中再也没有匹配的链接,或调度器中的Request对象用尽,程序才停止。



输出结果如下所示,包括爬取的标题HTML源码“<title>贵州农经网</title>”和标题内容“贵州农经网”,如图所示。


接下来我们需要爬取商品信息,调用response.xpath('//tr[@class="odd gradeX"]')方法定位到class属性为“odd gradeX”的tr节点,并分别获取五个td节点,对应五个字段内容。完整代码如下所示:

GZSpider.py

# -*- coding: utf-8 -*-
import scrapy
from scrapy import Request
from scrapy.selector import Selector  
from GZProject.items import *  

class GZSpider(scrapy.Spider):
    name = "gznw"                #贵州农产品爬虫
    allowed_domains = ["gznw.gov.cn"]
    start_urls = [
       "http://www.gznw.gov.cn/priceInfo/getPriceInfoByAreaId.jx?areaid=22572&page=1"
    ]

    def parse(self, response): 
        print '----------------Start------------------'
        print response.url

        for sel in response.xpath('//tr[@class="odd gradeX"]'):
            item = GzprojectItem()
            num1 = sel.xpath('td[1]/text()').extract()[0]
            num2 = sel.xpath('td[2]/text()').extract()[0]
            num3 = sel.xpath('td[3]/text()').extract()[0]
            num4 = sel.xpath('td[4]/text()').extract()[0]
            num5 = sel.xpath('td[5]/text()').extract()[0]
            print num1,num2,num3,num4,num5
            item['num1'] = num1
            item['num2'] = num2
            item['num3'] = num3
            item['num4'] = num4
            item['num5'] = num5
            yield item
        print '\n'

输出内容如下所示,同时调用item = GzprojectItem()”代码声明了栏目item,再调用“item['num1'] = num1”代码将爬取的数据存储至栏目中。

----------------Start------------------
http://www.gznw.gov.cn/priceInfo/getPriceInfoByAreaId.jx?areaid=22572&page=1
猕猴桃 26 元/公斤 贵阳市息烽县城区集贸市场 2018-02-09 14:22:28
山楂 40 元/公斤 贵阳市息烽县城区集贸市场 2018-02-09 14:22:28
柿子 12 元/公斤 贵阳市息烽县城区集贸市场 2018-02-09 14:22:28
板栗 36 元/公斤 贵阳市息烽县城区集贸市场 2018-02-09 14:22:28
开心果 80 元/公斤 贵阳市息烽县城区集贸市场 2018-02-09 14:22:28
草莓 50 元/公斤 贵阳市息烽县城区集贸市场 2018-02-09 14:22:28
核桃 36 元/公斤 贵阳市息烽县城区集贸市场 2018-02-09 14:22:28
菜籽油 20 元/公斤 贵阳市息烽县城区集贸市场 2018-02-09 14:22:28
龙眼 20 元/公斤 贵阳市息烽县城区集贸市场 2018-02-09 14:22:28
车厘子 100 元/公斤 贵阳市息烽县城区集贸市场 2018-02-09 14:22:28

对应输出内容如图所示。



讲到这里,我们已经将贵州农经网第一页的商品信息爬取了,那其他页面的信息,不同日期的商品信息如何爬取呢?Scrapy又怎么实现跳转翻页爬虫呢?




五. 实现翻页功能及多页面爬取

接下来我们讲解Scrapy爬虫的三种翻页方法供大家学习。当然还有更多方法,比如利用Rule类定义网页超链接的规则进行爬取,请读者下来研究,这里主要提供三种简单的翻页思想。

贵州农经网的超链接可以通过URL字段“page=页码”实现翻页,比如第二页的超链接为“http://www.gznw.gov.cn/priceInfo/getPriceInfoByAreaId.jx?areaid=22572&page=2”,我们访问该超链接就可以获取第二页的商品信息,如下图所示,访问其他网页的原理一样。



方法一:定义URLs超链接列表单分别爬取

Scrapy框架是支持并行爬取的,其爬取速度非常快,如果读者想爬取多个网页,可以将网页URL依次列在start_urls中。

# -*- coding: utf-8 -*-
import scrapy
from scrapy import Request
from scrapy.selector import Selector  
from GZProject.items import *  

class GZSpider(scrapy.Spider):
    name = "gznw"                #贵州农产品爬虫
    allowed_domains = ["gznw.gov.cn"]
    start_urls = [
     "http://www.gznw.gov.cn/priceInfo/getPriceInfoByAreaId.jx?areaid=22572&page=1",
     "http://www.gznw.gov.cn/priceInfo/getPriceInfoByAreaId.jx?areaid=22572&page=2",
     "http://www.gznw.gov.cn/priceInfo/getPriceInfoByAreaId.jx?areaid=22572&page=3"
    ]

    def parse(self, response): 
        print '----------------Start------------------'
        print response.url

        for sel in response.xpath('//tr[@class="odd gradeX"]'):
            item = GzprojectItem()
            num1 = sel.xpath('td[1]/text()').extract()[0]
            num2 = sel.xpath('td[2]/text()').extract()[0]
            num3 = sel.xpath('td[3]/text()').extract()[0]
            num4 = sel.xpath('td[4]/text()').extract()[0]
            num5 = sel.xpath('td[5]/text()').extract()[0]
            print num1,num2,num3,num4,num5

        print '\n'

输出如下图所示,可以看到采用Scrapy爬取了三页商品内容。

方法二:拼接不同网页URL并发送请求爬取

假设我们的URL很多,如果采用方法一显然是不可行的,那么怎么处理呢?这里我们提出了第二种方法,通过拼接不同网页的URL,循环发送请求进行爬取。拼接方法如下:

next_url="http://www.gznw.gov.cn/priceInfo/getPriceInfoByAreaId.jx?areaid=22572&page="+str(i)

在parse()函数中定义一个while循环,通过“yield Request(next_url)”代码发送新的爬取请求,并循环调用parse()函数进行爬取。完整代码如下所示:

GZSpider.py

# -*- coding: utf-8 -*-
import scrapy
from scrapy import Request
from scrapy.selector import Selector  
from GZProject.items import *  

class GZSpider(scrapy.Spider):
    name = "gznw"                #贵州农产品爬虫
    allowed_domains = ["gznw.gov.cn"]
    start_urls = [
     "http://www.gznw.gov.cn/priceInfo/getPriceInfoByAreaId.jx?areaid=22572&page=1"
    ]

    def parse(self, response): 
        print '----------------Start------------------'
        print response.url

        for sel in response.xpath('//tr[@class="odd gradeX"]'):
            item = GzprojectItem()
            num1 = sel.xpath('td[1]/text()').extract()[0]
            num2 = sel.xpath('td[2]/text()').extract()[0]
            num3 = sel.xpath('td[3]/text()').extract()[0]
            num4 = sel.xpath('td[4]/text()').extract()[0]
            num5 = sel.xpath('td[5]/text()').extract()[0]
            print num1,num2,num3,num4,num5
            item['num1'] = num1
            item['num2'] = num2
            item['num3'] = num3
            item['num4'] = num4
            item['num5'] = num5
            yield item
        print '\n'

        #循环换页爬取
        i = 2
        while i<=10:
            next_url = "http://www.gznw.gov.cn/priceInfo/getPriceInfoByAreaId.jx?areaid=22572&page="+str(i)
            i = i + 1
            yield Request(next_url)

输出部分结果如下所示:

----------------Start------------------
http://www.gznw.gov.cn/priceInfo/getPriceInfoByAreaId.jx?areaid=22572&page=8
豇豆 12 元/公斤 贵阳市息烽县城区集贸市场 2018-02-09 14:22:25
红薯 12 元/公斤 贵阳市息烽县城区集贸市场 2018-02-09 14:22:25
老南瓜 15 元/公斤 贵阳市息烽县城区集贸市场 2018-02-09 14:22:25
菠菜 12 元/公斤 贵阳市息烽县城区集贸市场 2018-02-09 14:22:25
平菇/冻菌 20 元/公斤 贵阳市息烽县城区集贸市场 2018-02-09 14:22:25
贡梨 26 元/公斤 贵阳市息烽县城区集贸市场 2018-02-09 14:22:25
油菜苔 23 元/公斤 贵阳市息烽县城区集贸市场 2018-02-09 14:22:25
韭菜 15 元/公斤 贵阳市息烽县城区集贸市场 2018-02-09 14:22:25
绿豆(干) 12 元/公斤 贵阳市息烽县城区集贸市场 2018-02-09 14:22:25
丝瓜 12 元/公斤 贵阳市息烽县城区集贸市场 2018-02-09 14:22:25

----------------Start------------------
http://www.gznw.gov.cn/priceInfo/getPriceInfoByAreaId.jx?areaid=22572&page=10
黄瓜 15 元/公斤 贵阳市息烽县城区集贸市场 2018-02-09 14:22:25
花生油 40 元/公斤 贵阳市息烽县城区集贸市场 2018-02-09 14:22:25
鹌鹑蛋 20 元/公斤 贵阳市息烽县城区集贸市场 2018-02-09 14:22:25
血橙 15 元/公斤 贵阳市息烽县城区集贸市场 2018-02-09 14:22:24
羊肉 240 元/公斤 贵阳市息烽县城区集贸市场 2018-02-09 14:22:24
莲花白 6 元/公斤 贵阳市息烽县城区集贸市场 2018-02-09 14:22:24
小葱 12 元/公斤 贵阳市息烽县城区集贸市场 2018-02-09 14:22:24
绿豆 25 元/公斤 贵阳市息烽县城区集贸市场 2018-02-09 14:22:24
面粉(标准一级) 6 元/公斤 贵阳市息烽县城区集贸市场 2018-02-09 14:22:24
脐橙 15 元/公斤 贵阳市息烽县城区集贸市场 2018-02-09 14:22:24

----------------Start------------------
http://www.gznw.gov.cn/priceInfo/getPriceInfoByAreaId.jx?areaid=22572&page=6
羔蟹 50 元/公斤 贵阳市息烽县城区集贸市场 2018-02-09 14:22:26
草鱼 50 元/公斤 贵阳市息烽县城区集贸市场 2018-02-09 14:22:26
青蛇果 36 元/公斤 贵阳市息烽县城区集贸市场 2018-02-09 14:22:26
红蛇果 32 元/公斤 贵阳市息烽县城区集贸市场 2018-02-09 14:22:26
芒果 26 元/公斤 贵阳市息烽县城区集贸市场 2018-02-09 14:22:26
猪肉(肥瘦) 32 元/公斤 贵阳市息烽县城区集贸市场 2018-02-09 14:22:26
都匀毛尖 1,000 元/公斤 贵阳市息烽县城区集贸市场 2018-02-09 14:22:26
鲤鱼 60 元/公斤 贵阳市息烽县城区集贸市场 2018-02-09 14:22:26
鲢鱼 60 元/公斤 贵阳市息烽县城区集贸市场 2018-02-09 14:22:26
鳝鱼 60 元/公斤 贵阳市息烽县城区集贸市场 2018-02-09 14:22:26

方法三:获取下一页超链接请求爬取内容

下面讲解另一种方法,获取下一页的超链接并发送请求进行爬取。通过审查元素,我们可以看到“下一页”对应的HTML源代码如下图所示。



这里我们通过代码获取class为“page-link next”的超链接(<a>),如果存在“下一页”超链接,则进行跳转爬取,如果“下一页”超链接为空,则停止爬取。核心代码如下:

next_url = response.xpath('//a[@class="page-link next"]/@href').extract()
if next_url is not None:
    next_url = 'http://www.gznw.gov.cn/priceInfo/getPriceInfoByAreaId.jx' + next_url[0]
    yield Request(next_url, callback=self.parse)

爬取的结果为"?areaid=22572&page=3",再对获取的超链接进行拼接,得到的URL为"http://www.gznw.gov.cn/priceInfo/getPriceInfoByAreaId.jx?areaid=22572&page=3",再调用Request()函数发送请求,爬取内容。但由于贵州农经网有4万多个页面,建议大家设置爬取网页的数量,代码如下:

i = 0
next_url = response.xpath('//a[@class="page=link next"]/@href').extract()
if next_(url is not None) and i<20:
    i = i + 1
    next_url = 'http://www.gznw.gov.cn/priceInfo/getPriceInfoByAreaId.jx' + next_url[0]
    yield Request(next_url, callback=self.parse)

接下来告诉大家如何将爬取的数据存储至本地。




六. 设置pipelines文件保存数据至本地

pipeLine文件是用来对Spider返回的Item列表进行保存操作,可以写入到文件或者数据库中。pipeLine只有一个需要实现的方法:process_item比如将我们的Item保存到JSON格式文件中,完整代码如下:

pipelines.py

# -*- coding: utf-8 -*-

# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: http://doc.scrapy.org/en/latest/topics/item-pipeline.html
import codecs
import json

class GzprojectPipeline(object):

    def __init__(self):  
        self.file = codecs.open('guizhou.json', 'w', encoding='utf-8')
        
    def process_item(self, item, spider):
        line = json.dumps(dict(item), ensure_ascii=False) + "\n"  
        self.file.write(line)  
        return item  
        
    def spider_closed(self, spider):  
        self.file.close()  

调用codecs.open('guizhou.json', 'w', encoding='utf-8')函数将数据存储至“guizhou.json”文件中,最后设置settings.py文件的优先级。




七. 设置settings文件

在该文件中设置如下代码,将贵州农经网爬虫的优先级设置为1优先级范围从11000,越小优先级越高;“GZProject.pipelines.GzprojectPipeline”表示要设置的通道。

settings.py

ITEM_PIPELINES = {
    'GZProject.pipelines.GzprojectPipeline': 1
}

最后输入代码“scrapy crawl gznw”执行爬虫,输出部分结果如下所示。



同时,在本地创建的“guizhou.json”文件中保存数据如下所示,采用键值对形式显示。


如果读者想存储为CSV文件,则执行“scrapy crawl gznw -o gz.csv”,输出截图如下所示:


写到这里,一个完整的Scrapy爬取贵州农经网的农产品数据已经讲完了,后面我也将继续学习Rule类以及其不同页面的爬取,甚至包括存储至数据库中。更多的爬虫知识希望读者下来结合实际需求和项目进行深入学习,并爬取所需的数据集。

(By:Eastmount 2018-02-11 深夜4点 http://blog.csdn.net/eastmount/)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[Python Scrapy爬虫] 二.翻页爬取农产品信息并保存本地 的相关文章

  • Scrapy 不会抓取所有页面

    这是我的工作代码 from scrapy item import Item Field class Test2Item Item title Field from scrapy http import Request from scrapy
  • scrapy-redis程序不会自动关闭

    scrapy redis框架 redis存储的xxx requests已经爬取完毕 但是程序还在运行 如何自动停止程序 而不是一直在运行 运行代码 2017 08 07 09 17 06 scrapy extensions logstats
  • 在 Windows 10、Python 3.8.0 上安装 Twisted 时出错

    无法安装 Twistedpip install Twisted windows platform 在 Windows 10 上使用 Python 3 8 0 错误 ERROR Command errored out with exit st
  • Scrapy CrawlSpider 无法抓取第一个登陆页面

    我是 Scrapy 的新手 正在进行抓取练习 并且正在使用 CrawlSpider 尽管 Scrapy 框架运行良好并且它遵循相关链接 但我似乎无法使 CrawlSpider 抓取第一个链接 主页 登陆页面 相反 它直接抓取由规则确定的链接
  • 从 Django 调用 Scrapy Spider

    我有一个项目 在同一工作区中包含 django 和 scrapy 文件夹 my project django project django project settings py app1 app2 manage py scrapy pro
  • 如何在Scrapy中迭代div?

    这可能是一个非常微不足道的问题 但我是 Scrapy 的新手 我试图找到问题的解决方案 但我只是看不出这段代码有什么问题 我的目标是废弃给定网站上的所有歌剧节目 每个节目的数据都位于一个具有 row fluid row performanc
  • 我有 12000 个已知 URL,用 Python 抓取它们的最快方法是什么?

    因此 我有一个从数据库中提取的 URL 列表 我需要抓取并解析每个 URL 的 JSON 响应 某些 URL 返回 null 而其他 URL 返回发送到 csv 文件的信息 我目前正在使用Scrapy 但是抓取这12000个URL大约需要4
  • 如何在 Scrapy/Twisted 中使用线程,即如何在响应回调中对阻塞代码进行异步调用?

    我需要在Scrapy中运行一些多线程 多处理工作 因为我有一些使用阻塞调用的库 并在完成后将请求放回Scrapy引擎 我需要这样的东西 def blocking call self html do some work in blocking
  • 使用scrapy到json文件只得到一行输出

    好吧 我对一般编程很陌生 并且具体使用 Scrapy 来实现此目的 我编写了一个爬虫来从 pinterest com 上的 pin 获取数据 问题是我以前从我正在抓取的页面上的所有引脚获取数据 但现在我只获取第一个引脚的数据 我认为问题出在
  • 抓取多个帐户,即多次登录

    我可以成功抓取单个帐户的数据 我想在一个网站上抓取多个帐户 这意味着多次登录 如何管理登录 注销 您可以在每个帐户会话中使用多个 cookiejar 并行抓取多个帐户 请参阅 cookiejar 请求元密钥http doc scrapy o
  • BaseSpider 和 CrawlSpider 的区别

    我一直在尝试理解在网页抓取中使用 BaseSpider 和 CrawlSpider 的概念 我已阅读docs http doc scrapy org en latest topics spiders html但没有提及BaseSpider
  • scrapy python 请求未定义

    我在这里找到了答案 code for site in sites Link site xpath a href extract CompleteLink urlparse urljoin response url Link yield Re
  • 如何使用scrapy抓取xml url

    你好 我正在使用 scrapy 来抓取 xml url 假设下面是我的 Spider py 代码 class TestSpider BaseSpider name test allowed domains www example com s
  • Scrapy 未通过请求回调从项目中的已抓取链接返回附加信息

    基本上 下面的代码会抓取表格的前 5 项 其中一个字段是另一个 href 单击该 href 会提供更多信息 我想收集这些信息并将其添加到原始项目中 所以parse应该将半填充的项目传递给parse next page然后刮掉下一位并返回完成
  • Scrapy - 使用 TwistedScheduler 时出现 ReactorAlreadyInstalledError

    我有以下 Python 代码来启动 APScheduler TwistedScheduler cronjob 来启动蜘蛛 使用一只蜘蛛不是问题 而且效果很好 然而 使用两个蜘蛛会导致错误 twisted internet error Rea
  • Selenium 与 scrapy 的动态页面

    我正在尝试使用 scrapy 从网页中抓取产品信息 我要抓取的网页如下所示 从包含 10 个产品的 Product list 页面开始 单击 下一步 按钮将加载接下来的 10 个产品 两个页面之间的 URL 不会改变 我使用 LinkExt
  • Scrapy Spider不存储状态(持久状态)

    您好 有一个基本的蜘蛛 可以运行以获取给定域上的所有链接 我想确保它保持其状态 以便它可以从离开的位置恢复 我已按照给定的网址进行操作http doc scrapy org en latest topics jobs html http d
  • 即使收到 200 状态代码也重试 Scrapy 请求

    我正在抓取一个网站 有时会返回 200 但在 response body 中没有任何文本 当我尝试使用 Selector 解析它时会引发 AttributeError 是否有一种简单的方法来检查以确保正文包含文本 如果没有 则重试请求 直到
  • 如何更改 scrapy view 命令使用的浏览器?

    如何更改 scrapy shell 中 view response 命令使用的浏览器 我的机器上默认使用 safari 但我希望它使用 chrome 因为 chrome 中的开发工具更好 As eLRuLL https stackoverf
  • scrapy获取同一个类的第n个子文本

    我附上了一张照片 我面临的问题是获取同一类的第一个元素 我想得到 adxHeader gt adxExtraInfo 1st one gt adxExtraInfoPart 1st one gt a text 我编写了以下代码但不起作用 任

随机推荐

  • 11010序列检测器Verilog代码及仿真测试文件

    1 11010序列检测器 状态转移图 2 Verilog代码 module fsm x z clk rst data input clk rst x input 20 0 data output reg z reg 2 0 state ns
  • 作为程序员,赚取额外收入的 4个简单副业!

    对于程序员来说 可不是只有赚死工资这一条道路 好学编程给大家总结一下有哪些兼职渠道 以供大家参考 1 知识变现 一些问答平台比如微博 知乎 悟空问答 芝麻问答 饭团 知识星球 付费QQ群 付费社群等等 我们都可以挑选自己专业领域的问题选择回
  • 立体渲染(Stereo Rendering)

    首发于 GPU架构浅析 写文章 Multi View与Multi Viewport xiaocai Junio
  • spark学习9:sparkStreaming

    1 sparkStreaming是什么 sparkStreaming 其实是对RDD进行微批量处理 核心还是对RDD的操作 只不过spark是线程级的应用 实现秒级的运算是可以的 所以sparkStreaming并不是真正意义上的流处理 最
  • QT 发布打包 缺少依赖dll问题解决

    QT 在开发环境中测试时 开发环境会自动连接需要的依赖dll库 在产品发布时 需要将自己的exe和依赖的dll库 整体打包分发 避免其他设备缺少依赖的dll QT windeployqt exe 就是为了解决产品发布 打包问题的 有很多博客
  • python xlwt生成excel,列数大于256,分表

    usr bin python coding utf8 import xlwt def write data to excel print 开始生成 wbk xlwt Workbook sheets sheet wbk add sheet S
  • SGX技术的分析与研究 学习笔记

    SGX技术的分析与研究 学习笔记 SGX技术的分析与研究 学习笔记 1 SGX架构概述 2 SGX关键技术 2 1 Enclave安全容器 2 2 Enclave保护机制 2 2 1 内存访问语义 2 2 2 地址映射保护 2 2 3 En
  • FFmpeg入门详解之92:Live555学习之(一)-------Live555的基本介绍

    Live555学习之 一 Live555的基本介绍 前一阵子 因为项目需要 研究了一下Live555开源框架 研究的不是很深入 基本上把Live555当做API用了一下 但是毕竟也是本人看的第一个开源框架 在此记录总结一下 Live555是
  • ios sdk 穿山甲_iOS 穿山甲广告 SDK 的使用

    信息流广告 自定义使用时 相关类的使用 BUAdSlot 广告位类 加载广告时需要设置的广告位描述信息 传入广告的主要请求 ID 广告类型 位置等 BUMaterialMeta 广告数据的载体类 访问可以获取所有的广告属性 主要属性名 数据
  • LevelDB源码阅读-key

    levelDB中的key 前言 在levelDB中有五种不同的key 在正式分析memtable之前我们先介绍一下这5中不同的key user key ParsedInternalKey InternalKey LookupKey Memt
  • 7.4 初等矩阵和可逆性

    初等矩阵和可逆性 初等矩阵 对单位矩阵 进行 一次 初等变换 得到 初等矩阵一定是可逆的 gt 因为初等变换是可逆的 所以初等矩阵是可逆的 对于一般矩阵 如果可逆的话 怎样得到逆矩阵呢 根据之前的分析 gt 如果矩阵A可逆的话 即存在一系列
  • java输入只有一行_即三个整数_中间用空格隔开_蓝桥杯 算法训练 排序

    问题描述 编写一个程序 读入一组整数 这组整数是按照从小到大的顺序排列的 它们的个数N也是由用户输入的 最多不会超过20 然后程序将对这个数组进行统计 把出现次数最多的那个数组元素值打印出来 如果有两个元素值出现的次数相同 即并列第一 问题
  • 注解@Autowired是如何实现的

    1 Autowired注解用法 2 Autowired注解的作用到底是什么 Autowired这个注解我们经常在使用 现在 我想问的是 它的作用到底是什么呢 首先 我们从所属范围来看 事实上这个注解是属于spring的容器配置的一个注解 与
  • MySQL高级篇_第10章_索引优化与查询优化

    都有哪些维度可以进行数据库调优 简言之 索引失效 没有充分利用到索引 索引建立 关联查询太多JOIN 设计缺陷或不得已的需求 SQL优化 服务器调优及各个参数设置 缓冲 线程数等 调整my cnf 数据过多 分库分表 关于数据库调优的知识点
  • 如何看服务器请求信息,如何看服务器请求信息

    如何看服务器请求信息 内容精选 换一换 请求URI由如下部分组成 URI scheme Endpoint resource path query string 例如您需要获取华北 北京四区域设备管理服务的accessToken 查询到的En
  • LambdaQueryWrapper中常用方法

    LambdaQueryWrapper中常用方法 LambdaQueryWrapper实例1 2 链式查询 3 排序查询以及between and查询 4 修改
  • 微信记账小程序

    第1章 绪论 1 1 研究背景与意义 随着网络时代的到来 互联网的优势和普及时刻影响并改变着人们的生活方式 在信息技术迅速发展的今天 计算机技术已经遍及全球 使社会发生了巨大的变革 为了不受时间和地点的限制 智能手机用户可以通过移动网络访问
  • 量化投资学习-39:股市里看人生

    1 股市 1 1 股市就是一个舞台 股市就是一个大舞台 在这个舞台上 每天上演着无数的人生悲喜故事 股市上的每只股票背后都是一种人的人生故事 有大起大落 有平淡无奇 有蓄势待发 有气势如虹 有高楼起 有楼塌了 起起伏伏 跌跌宕宕才是规律 1
  • CGI环境变量

    CGI环境变量 所有的CGI程序都接收以下的环境变量 这些变量在CGI程序中发挥了重要的作用 变量名 描述 CONTENT TYPE 这个环境变量的值指示所传递来的信息的MIME类型 目前 环境变量CONTENT TYPE一般都是 appl
  • [Python Scrapy爬虫] 二.翻页爬取农产品信息并保存本地

    前面 Python爬虫之Selenium Phantomjs CasperJS 介绍了很多Selenium基于自动测试的Python爬虫程序 主要利用它的xpath语句 通过分析网页DOM树结构进行爬取内容 同时可以结合Phantomjs模