中国农产品信息网站scrapy-redis分布式爬取数据

时间:2022-04-14 05:36:16

---恢复内容开始---

基于scrapy_redis和mongodb的分布式爬虫

项目需求:

1:自动抓取每一个农产品的详细数据

2:对抓取的数据进行存储

第一步:

创建scrapy项目

中国农产品信息网站scrapy-redis分布式爬取数据

中国农产品信息网站scrapy-redis分布式爬取数据

创建爬虫文件

中国农产品信息网站scrapy-redis分布式爬取数据

在items.py里面定义我们要爬取的数据

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

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

import scrapy

class NongcpspiderItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    # 供求关系
    supply = scrapy.Field()
    # 标题
    title = scrapy.Field()
    # 发布时间
    create_time = scrapy.Field()
    # 发布单位
    unit = scrapy.Field()
    # 联系人
    contact = scrapy.Field()
    # 手机号码
    phone_number = scrapy.Field()
    # 地址
    address = scrapy.Field()
    # 详细地址
    detail_address = scrapy.Field()
    # 上市时间
    market_time = scrapy.Field()
    # 价格
    price = scrapy.Field()

将settings.py改为false

中国农产品信息网站scrapy-redis分布式爬取数据

写spider爬虫文件nongcp_spider.py,进行字段解析使用xpath,正则表达式

# -*- coding: utf-8 -*-
import scrapy
import re
from ..items import NongcpspiderItem

class NongcpSpiderSpider(scrapy.Spider):
    name = 'nongcp_spider'
    # allowed_domains = ['http://www.nongnet.com/']
    start_urls = ['http://www.nongnet.com/']

    def parse(self, response):
        """
        解析详情页和下一页url
        :param response:
        :return:
        """
        detail_urls = response.xpath('//li[@class="lileft"]/a/@href').extract()
        for detail_url in detail_urls:
            yield scrapy.Request(url=self.start_urls[0]+detail_url, callback=self.detail_parse)

        next_url = response.xpath("//span[@id='ContentMain_lblPage']/a/@href").extract()
        if next_url:
            yield scrapy.Request(url=self.start_urls[0]+next_url[-2])

    def detail_parse(self, response):
        """
        解析具体的数据
        :param response:
        :return:
        """
        items = NongcpspiderItem()
        title_result = response.xpath('//h1[@class="h1class"]/text()').extract_first()
        if title_result:
            items['supply'] = title_result.strip()[1:2]
            items['title'] = title_result.strip()[3:]
        creatte_time = re.findall(r"<font color='999999'>时间:(\d+/\d+/\d+ \d+:\d+) &nbsp", response.text)
        if creatte_time:
            items['create_time'] = creatte_time[0]
        unit = re.findall(r"发布单位</div><div class='xinxisxr'><a href='.*?.aspx'>(.*?)</a>", response.text, re.S)
        if unit:
            items['unit'] = unit[0]
        price = response.xpath('//div[@class="scdbj1"]/text()').extract()
        if price:
            items['price'] = ''.join(price)
        yield items

编写pipelines.py,往mongodb里面存储数据

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

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

class NongcpspiderPipeline(object):
    def process_item(self, item, spider):
        return item

class MongoPipeline(object):
    def __init__(self):
        client = pymongo.MongoClient(host='127.0.0.1', port=27017)
        self.db = client['nong']
        self.connection = self.db['Info']
        self.dbinfo = self.db.authenticate('xxxx', 'xxxx')

    def process_item(self, item, spider):
        self.connection.save(dict(item))
        return item

完成以上步骤就可以进行数据的爬取了,接下来我们来测试一下爬取的效果

编写启动脚本start.py

中国农产品信息网站scrapy-redis分布式爬取数据

#encoding: utf-8

from scrapy import cmdline

# cmdline.execute("scrapy crawl qsbk_spider".split())
cmdline.execute(["scrapy", 'crawl', 'nongcp_spider'])

开启settings.py  pipelines字段

中国农产品信息网站scrapy-redis分布式爬取数据

运行程序,爬取到的效果如下

中国农产品信息网站scrapy-redis分布式爬取数据


接下来实现分布式去重爬取

先安装scrapy-redis

中国农产品信息网站scrapy-redis分布式爬取数据

在settings.py里面配置scrapy-redis组件

中国农产品信息网站scrapy-redis分布式爬取数据

在pipelines.py引入mongdb配置

中国农产品信息网站scrapy-redis分布式爬取数据

修改nongcp_spider.py文件

中国农产品信息网站scrapy-redis分布式爬取数据

如果爬取过程中出现封ip的操作,我们可以设置middlewares.py,,在该文件设置代理

使用阿布云代理

中国农产品信息网站scrapy-redis分布式爬取数据

先启动start.py文件,在运行redis-cli

中国农产品信息网站scrapy-redis分布式爬取数据

中国农产品信息网站scrapy-redis分布式爬取数据

然后就可以抓取数据了到mongdb里面了

---恢复内容结束---

中国农产品信息网站scrapy-redis分布式爬取数据的更多相关文章

  1. 爬虫--scrapy&plus;redis分布式爬取58同城北京全站租房数据

    作业需求: 1.基于Spider或者CrawlSpider进行租房信息的爬取 2.本机搭建分布式环境对租房信息进行爬取 3.搭建多台机器的分布式环境,多台机器同时进行租房数据爬取 建议:用Pychar ...

  2. Scrapy持久化存储-爬取数据转义

    Scrapy持久化存储 爬虫爬取数据转义问题 使用这种格式,会自动帮我们转义 'insert into wen values(%s,%s)',(item['title'],item['content' ...

  3. scrapy使用PhantomJS爬取数据

    环境:python2.7+scrapy+selenium+PhantomJS 内容:测试scrapy+PhantomJS 爬去内容:涉及到js加载更多的页面 原理:配置文件打开中间件+修改proces ...

  4. scrapy-redis &plus; Bloom Filter分布式爬取tencent社招信息

    scrapy-redis + Bloom Filter分布式爬取tencent社招信息 什么是scrapy-redis 什么是 Bloom Filter 为什么需要使用scrapy-redis + B ...

  5. scrapy-redis分布式爬取tencent社招信息

    scrapy-redis分布式爬取tencent社招信息 什么是scrapy-redis 目标任务 安装爬虫 创建爬虫 编写 items.py 编写 spiders/tencent.py 编写 pip ...

  6. Scrapy 分布式爬取

    由于受到计算机能力和网络带宽的限制,单台计算机运行的爬虫咋爬取数据量较大时,需要耗费很长时间.分布式爬取的思想是“人多力量大”,在网络中的多台计算机同时运行程序,公童完成一个大型爬取任务, Scrap ...

  7. scrapy-redis实现爬虫分布式爬取分析与实现

    本文链接:http://blog.csdn.net/u012150179/article/details/38091411 一 scrapy-redis实现分布式爬取分析 所谓的scrapy-redi ...

  8. scrapy-redis分布式爬取知乎问答,使用docker布置多台机器。

    先上结果: 问题: 答案: 可以看到现在答案文档有十万多,十万个为什么~hh 正文开始: 分布式爬虫应该是在多台服务器(A B C服务器)布置爬虫环境,让它们重复交叉爬取,这样的话需要用到状态管理器. ...

  9. Python使用Scrapy框架爬取数据存入CSV文件&lpar;Python爬虫实战4&rpar;

    1. Scrapy框架 Scrapy是python下实现爬虫功能的框架,能够将数据解析.数据处理.数据存储合为一体功能的爬虫框架. 2. Scrapy安装 1. 安装依赖包 yum install g ...

随机推荐

  1. JavaScript数组的方法

    push()     :将参数加载到数组的最后,返回数组的长度 pop()    :删除数组的最后一个元素,返回删除的值 shift()      :删除数组的第一个元素,返回删除的值 unshift ...

  2. ubuntu绑定串口设备

    原创博文:转载请标明出处:http://www.cnblogs.com/zxouxuewei 为了不让我们的usb设备在使用时,由于设备节点注册的ID不同,设备名称会不同,设备如何在 Linux 中永 ...

  3. Android项目,从web上取下汉字,中文部分乱码

    Android项目,从web上取下汉字,中文部分乱码. 常见问题,搜索一下,网上有很多办法解决.如果还没有试过这个办法,可以尝试一下. BufferedReader in = new Buffered ...

  4. 跟着百度学PHP&lbrack;4&rsqb;OOP面对对象编程-13-魔术方法&lowbar;&lowbar;set&lpar;&rpar;,&lowbar;&lowbar;get&lpar;&rpar;,&lowbar;&lowbar;isset&lpar;&rpar;,&lowbar;&lowbar;unset&lpar;&rpar;

    __set() 在对象访问私有成员的时候自动被调用,达到了给你看,但是不能给你修改的效果!(在对象访问一个私有的成员的时候就会自动的调用该魔术方法) __get() 方法用于获取私有属性值.(在设置私 ...

  5. 关于&lbrack;LeetCode&rsqb;Factorial Trailing Zeroes O&lpar;logn&rpar;解法的理解

    题目描述: Given an integer n, return the number of trailing zeroes in n!. 题目大意: 给定一个整数n,返回n!(n的阶乘)结果中后缀0 ...

  6. 解决ansible首次连接host服务器需验证问题

    问题描述: [root@iZm5e79rtwsq2hm57teyk5Z ansible]# ansible aofeng -f 5 -m ping 47.93.18.191 | FAILED! =&g ...

  7. HDU1542 扫描线&lpar;矩形面积并&rpar;

    Atlantis Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Su ...

  8. 深入理解softmax函数

    Softmax回归模型,该模型是logistic回归模型在多分类问题上的推广,在多分类问题中,类标签  可以取两个以上的值.Softmax模型可以用来给不同的对象分配概率.即使在之后,我们训练更加精细 ...

  9. cacti+CentOS6&period;5

    系统版本:CentOS6.5 软件版本:cacti-0.88f 需要预安装的软件有以下几种,可以通过yum安装全部 yum -y install net-snmp* yum -y install op ...

  10. MVC4小细节

    一: @model 指令 或者也叫  @model关键字   注释:@model指令以提供一个更干净简洁的方式来指明你想要在视图文件中引用强类型模型类 作用:让视图文件(cshtml)更易读易写;VS ...