python3 [爬虫入门实战]scrapy爬取盘多多五百万数据并存mongoDB

2023-11-10

总结:虽然是第二次爬取,但是多多少少还是遇到一些坑,总的结果还是好的,scrapy比多线程多进程强多了啊,中途没有一次被中断过。

此版本是盘多多爬取数据的scrapy版本,涉及数据量较大,到现在已经是近500万的数据了。

1,抓取的内容

这里写图片描述

主要爬取了:文件名,文件链接,文件类型,文件大小,文件浏览量,文件收录时间

一,scrapy中item.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 PanduoduoItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    # pass
    # 文件名称
    docName = scrapy.Field()
    # 文件链接
    docLink = scrapy.Field()
    # 文件分类
    docType = scrapy.Field()
    # 文件大小
    docSize = scrapy.Field()
    # 网盘类型
    docPTpye = scrapy.Field()
    # 浏览量
    docCount = scrapy.Field()
    # 收录时间
    docTime = scrapy.Field()

在spider进行抓取出现的问题,(1),因为没有设置请求头信息,盘多多浏览器会返回403错误,不让进行数据的爬取,所以这里我们要进行user-agent的设置,(settings.py中)

USER_AGENT = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'

COOKIES_ENABLED = False

ROBOTSTXT_OBEY = False

(2)直接在def parse(self, response):方法中打印response.body会返回不是utf8的编码,(无奈的是没有做相应的处理,还是爬出来了。)

二,spider里面的代码

(1),在spider中遇到的问题还是有的,比如table下的tbody标签获取,因为内容都被tbody包裹起来的,最后测试半小时,我们可以直接获取table下的tr标签就可以了。
(2),在tr下有多个不规则的td标签,我们可以直接根据td[index]来获取相对于的数据,


贴上代码:

#encoding=utf8
import scrapy
from PanDuoDuo.items import PanduoduoItem

class Panduoduo(scrapy.Spider):
    name = 'panduoduo'
    allowed_domains =['panduoduo.net']
    start_urls = ['http://www.panduoduo.net/c/4/{}'.format(n) for n in range(1,86151)]#6151
    # start_urls = ['http://www.panduoduo.net/c/4/1']#6151
    def parse(self, response):
        base_url = 'http://www.panduoduo.net'
        # print(str(response.body).encode('utf-8'))
        node_list = response.xpath("//div[@class='ca-page']/table[@class='list-resource']")
        node_list = response.xpath("//table[@class='list-resource']/tr")
        # print(node_list)
        for node  in node_list:
            duoItem = PanduoduoItem()
            title = node.xpath("./td[@class='t1']/a/text()").extract()
            print(title)
            duoItem['docName'] = ''.join(title)
            link = node.xpath("./td[@class='t1']/a/@href").extract()
            linkUrl  = base_url+''.join(link)
            duoItem['docLink'] = linkUrl
            print(linkUrl)
            docType = node.xpath("./td[2]/a/text()").extract()
            duoItem['docType'] = ''.join(docType)
            print(docType)
            docSize = node.xpath("./td[@class='t2']/text()").extract()
            print(docSize)
            duoItem['docSize'] = ''.join(docSize)
            docCount = node.xpath("./td[5]/text()").extract()
            docTime = node.xpath("./td[6]/text()").extract()
            duoItem['docCount'] = ''.join(docCount)
            duoItem['docTime'] = ''.join(docTime)
            print(docCount)
            print(docTime)
            yield duoItem

(3)piplines.py里面的代码

在这里主要进行了存入mongodb的操作和写入json文件的操作,不过现在看来,存入json文件确实是多余的,因为数据量确实大了。(在存入mongodb的时候遇到过存入报错的问题,这时候可能是mongodb被占用的问题,把原来的进行删除再重新运行一遍就行了。)

代码:

# -*- 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 json
import pymongo
from scrapy.conf import settings

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

class DuoDuoMongo(object):
    def __init__(self):
        self.client = pymongo.MongoClient(host=settings['MONGO_HOST'], port=settings['MONGO_PORT'])
        self.db = self.client[settings['MONGO_DB']]
        self.post = self.db[settings['MONGO_COLL']]

    def process_item(self, item, spider):
        postItem = dict(item)
        self.post.insert(postItem)
        return item

# 写入json文件
class JsonWritePipline(object):
    def __init__(self):
        self.file = open('盘多多.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()

最后附上settings里面的代码,这里的没有用到代理词,浏览器什么的,所以暂时不用设置middlewares.py里面的文件
settings代码:

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

# Scrapy settings for PanDuoDuo project
#
# For simplicity, this file contains only settings considered important or
# commonly used. You can find more settings consulting the documentation:
#
#     http://doc.scrapy.org/en/latest/topics/settings.html
#     http://scrapy.readthedocs.org/en/latest/topics/downloader-middleware.html
#     http://scrapy.readthedocs.org/en/latest/topics/spider-middleware.html

BOT_NAME = 'PanDuoDuo'

SPIDER_MODULES = ['PanDuoDuo.spiders']
NEWSPIDER_MODULE = 'PanDuoDuo.spiders'


# Crawl responsibly by identifying yourself (and your website) on the user-agent
# USER_AGENT = 'PanDuoDuo (+http://www.yourdomain.com)'
USER_AGENT = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'

# Obey robots.txt rules
ROBOTSTXT_OBEY = False
# 配置mongoDB
MONGO_HOST = "127.0.0.1"  # 主机IP
MONGO_PORT = 27017  # 端口号
MONGO_DB = "PanDuo"  # 库名
MONGO_COLL = "pan_duo"  # collection

# Configure maximum concurrent requests performed by Scrapy (default: 16)
#CONCURRENT_REQUESTS = 32

# Configure a delay for requests for the same website (default: 0)
# See http://scrapy.readthedocs.org/en/latest/topics/settings.html#download-delay
# See also autothrottle settings and docs
#DOWNLOAD_DELAY = 3
# The download delay setting will honor only one of:
#CONCURRENT_REQUESTS_PER_DOMAIN = 16
#CONCURRENT_REQUESTS_PER_IP = 16

# Disable cookies (enabled by default)
COOKIES_ENABLED = False

# Disable Telnet Console (enabled by default)
#TELNETCONSOLE_ENABLED = False

# Override the default request headers:
#DEFAULT_REQUEST_HEADERS = {
#   'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
#   'Accept-Language': 'en',
#}

# Enable or disable spider middlewares
# See http://scrapy.readthedocs.org/en/latest/topics/spider-middleware.html
#SPIDER_MIDDLEWARES = {
#    'PanDuoDuo.middlewares.PanduoduoSpiderMiddleware': 543,
#}

# Enable or disable downloader middlewares
# See http://scrapy.readthedocs.org/en/latest/topics/downloader-middleware.html
#DOWNLOADER_MIDDLEWARES = {
#    'PanDuoDuo.middlewares.MyCustomDownloaderMiddleware': 543,
#}

# Enable or disable extensions
# See http://scrapy.readthedocs.org/en/latest/topics/extensions.html
#EXTENSIONS = {
#    'scrapy.extensions.telnet.TelnetConsole': None,
#}

# Configure item pipelines
# See http://scrapy.readthedocs.org/en/latest/topics/item-pipeline.html
ITEM_PIPELINES = {
   # 'PanDuoDuo.pipelines.PanduoduoPipeline': 300,
   'PanDuoDuo.pipelines.DuoDuoMongo': 300,
   'PanDuoDuo.pipelines.JsonWritePipline': 300,
}

# Enable and configure the AutoThrottle extension (disabled by default)
# See http://doc.scrapy.org/en/latest/topics/autothrottle.html
#AUTOTHROTTLE_ENABLED = True
# The initial download delay
# AUTOTHROTTLE_START_DELAY = 5
# The maximum download delay to be set in case of high latencies
#AUTOTHROTTLE_MAX_DELAY = 60
# The average number of requests Scrapy should be sending in parallel to
# each remote server
#AUTOTHROTTLE_TARGET_CONCURRENCY = 1.0
# Enable showing throttling stats for every response received:
#AUTOTHROTTLE_DEBUG = False

# Enable and configure HTTP caching (disabled by default)
# See http://scrapy.readthedocs.org/en/latest/topics/downloader-middleware.html#httpcache-middleware-settings
#HTTPCACHE_ENABLED = True
#HTTPCACHE_EXPIRATION_SECS = 0
#HTTPCACHE_DIR = 'httpcache'
#HTTPCACHE_IGNORE_HTTP_CODES = []
#HTTPCACHE_STORAGE = 'scrapy.extensions.httpcache.FilesystemCacheStorage'

最后再看一下数据库里面的数据:

这里写图片描述

再看一下现在的总数,还在继续爬取哦,从下午1:00左右爬的应该是,

这里写图片描述

到此end,下次学习任务,一定把模拟登陆搞懂了。

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

python3 [爬虫入门实战]scrapy爬取盘多多五百万数据并存mongoDB 的相关文章

  • 中断 Select 以添加另一个要在 Python 中监视的套接字

    我正在 Windows XP 应用程序中使用 TCP 实现点对点 IPC 我正在使用select and socketPython 2 6 6 中的模块 我有三个 TCP 线程 一个读取线程通常会阻塞select 一个通常等待事件的写入线程
  • 将html数据解析成python列表进行操作

    我正在尝试读取 html 网站并提取其数据 例如 我想查看公司过去 5 年的 EPS 每股收益 基本上 我可以读入它 并且可以使用 BeautifulSoup 或 html2text 创建一个巨大的文本块 然后我想搜索该文件 我一直在使用
  • 用枢轴点拟合曲线 Python

    我有下面的图 我想用 2 条线来拟合它 使用 python 我设法适应上半部分 def func x a b x np array x return a x b popt pcov curve fit func up x up y 我想用另
  • 跟踪 pypi 依赖项 - 谁在使用我的包

    无论如何 是否可以通过 pip 或 PyPi 来识别哪些项目 在 Pypi 上发布 可能正在使用我的包 也在 PyPi 上发布 我想确定每个包的用户群以及可能尝试积极与他们互动 预先感谢您的任何答案 即使我想做的事情是不可能的 这实际上是不
  • 独立滚动矩阵的行

    我有一个矩阵 准确地说 是 2d numpy ndarray A np array 4 0 0 1 2 3 0 0 5 我想滚动每一行A根据另一个数组中的滚动值独立地 r np array 2 0 1 也就是说 我想这样做 print np
  • 您可以格式化 pandas 整数以进行显示,例如浮点数的“pd.options.display.float_format”?

    我见过this https stackoverflow com questions 18404946 py pandas formatdataframe and this https stackoverflow com questions
  • 在Python中连接反斜杠

    我是 python 新手 所以如果这听起来很简单 请原谅我 我想加入一些变量来生成一条路径 像这样 AAAABBBBCCCC 2 2014 04 2014 04 01 csv Id TypeOfMachine year month year
  • datetime.datetime.now() 返回旧值

    我正在通过匹配日期查找 python 中的数据存储条目 我想要的是每天选择 今天 的条目 但由于某种原因 当我将代码上传到 gae 服务器时 它只能工作一天 第二天它仍然返回相同的值 例如当我上传代码并在 07 01 2014 执行它时 它
  • 使用 xlrd 打开 BytesIO (xlsx)

    我正在使用 Django 需要读取上传的 xlsx 文件的工作表和单元格 使用 xlrd 应该可以 但因为文件必须保留在内存中并且可能不会保存到我不知道如何继续的位置 本例中的起点是一个带有上传输入和提交按钮的网页 提交后 文件被捕获req
  • Python 2:SMTPServerDisconnected:连接意外关闭

    我在用 Python 发送电子邮件时遇到一个小问题 me my email address you recipient s email address me email protected cdn cgi l email protectio
  • Python beautifulsoup 仅限 1 级文本

    我看过其他 beautifulsoup 得到相同级别类型的问题 看来我的有点不同 这是网站 我正试图拿到右边那张桌子 请注意表的第一行如何展开为该数据的详细细分 我不想要那个数据 我只想要最顶层的数据 您还可以看到其他行也可以展开 但在本例
  • 从Python中的字典列表中查找特定值

    我的字典列表中有以下数据 data I versicolor 0 Sepal Length 7 9 I setosa 0 I virginica 1 I versicolor 0 I setosa 1 I virginica 0 Sepal
  • “隐藏”内置类对象、函数、代码等的名称和性质[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我很好奇模块中存在的类builtins无法直接访问的 例如 type lambda 0 name function of module
  • MongoDB 聚合:如何检查数组中是否存在包含多个属性的对象

    我有一个对象数组 我想检查是否有一个对象与多个属性匹配 我尝试过使用 in and and但它并没有按照我想要的方式工作 这是我当前的实现 https mongoplayground net p dEQp2Q4DW0j 我有一个像这样的数组
  • 加快网络抓取速度

    我正在使用一个非常简单的网络抓取工具抓取 23770 个网页scrapy 我对 scrapy 甚至 python 都很陌生 但设法编写了一个可以完成这项工作的蜘蛛 然而 它确实很慢 爬行 23770 个页面大约需要 28 小时 我看过scr
  • Python3 在 DirectX 游戏中移动鼠标

    我正在尝试构建一个在 DirectX 游戏中执行一些操作的脚本 除了移动鼠标之外 我一切都正常 是否有任何可用的模块可以移动鼠标 适用于 Windows python 3 Thanks I used pynput https pypi or
  • 如何使用原始 SQL 查询实现搜索功能

    我正在创建一个由 CS50 的网络系列指导的应用程序 这要求我仅使用原始 SQL 查询而不是 ORM 我正在尝试创建一个搜索功能 用户可以在其中查找存储在数据库中的书籍列表 我希望他们能够查询 书籍 表中的 ISBN 标题 作者列 目前 它
  • 模拟pytest中的异常终止

    我的多线程应用程序遇到了一个错误 主线程的任何异常终止 例如 未捕获的异常或某些信号 都会导致其他线程之一死锁 并阻止进程干净退出 我解决了这个问题 但我想添加一个测试来防止回归 但是 我不知道如何在 pytest 中模拟异常终止 如果我只
  • Django-tables2 列总计

    我正在尝试使用此总结列中的所有值文档 https github com bradleyayers django tables2 blob master docs pages column headers and footers rst 但页
  • Pandas 每周计算重复值

    我有一个Dataframe包含按周分组的日期和 ID df date id 2022 02 07 1 3 5 4 2022 02 14 2 1 3 2022 02 21 9 10 1 2022 05 16 我想计算每周有多少 id 与上周重

随机推荐

  • 面向对象和面向过程思想概述

    面向过程的思想去实现一个功能的步骤 首先要做什么 怎么做 最后我们再代码体现 一步一步去实现 而具体的每一步都需要我 们去实现和操作 这些步骤相互调用和协作 实现我们的功能 每一个步骤我们都是参与者 并且 需要面对具体的每一个步骤和过程 这
  • 猿人学2023比赛题1~7题解之第一题

    前言 我从不回头看之我跟77的雨后小故事 这题有两个解法 分别是全局扣和找加密魔改点套库 方法一 全局扣 1 加密位置 2 确保在浏览器出值跟浏览器一样 1 先把全部代码拉下来 整体运行 发现会缺东西 这是发包的 直接删了就好 2 然后加密
  • mysql联合for update查询_sql的for update

    欢迎大家吐槽 oracle行级共享锁 通常是通过select from for update语句添加的 同时该方法也是我们用来手工锁定某些记录的主要方法 比如 当我们在查询某些记录的过程中 不希望其他用户对查询的记录进行更新操作 则可以发出
  • 【导航】RT-Thread 学习专栏目录 【快速跳转】

    本文是 矜辰所致 的 RT Thread 记录专栏的内容导航 结合自己的学习应用过程的总结记录 有基础理论 有与FreeRTOS的比较 有实际项目 有应用总结 目录 前言 一 环境篇 二 内核篇 三 设备和驱动篇 四 组件软件包篇 五 应用
  • [异步][jms][activeMq]如何做到重试机制不会导致一条消息被多次执行.

    淘宝海量存储之单机事务面临的问题及解决办法 http blog csdn net jiao fuyou article details 15499261 这篇文章讲的比较好 核心关键词 幂等 Message Queue ActiveMQ r
  • 前端HTML鼠标经过链接变换背景颜色

  • Win10关闭自带键盘的三种方法--亲测第三中命令方式有效(需要重启)

    Win10笔记本关闭自带键盘的方法 方法一 1 在Windows10系统桌面 右键点击桌面上的 此电脑 图标 在弹出菜单中选择 属性 菜单项 2 在打开的Windows系统属性窗口中 点击左侧边栏的 设备管理器 菜单项 3 这时会打开设备管
  • 二叉树及其遍历

    二叉树的定义 二叉二叉顾名思义 二叉树是每个节点最多有两个子树的树结构 二叉树的存储 二叉树的存储分为顺序存储和链式存储 顺序存储 深度为k的二叉树需要预留2 k 1 个存储单元 按编号顺序存储 遇空节点留空位 可以看到上面特别多的空节点
  • spring cloud alibaba使用

    文章目录 架构图 环境搭建 Nacos 下载以及配置 测试使用 界面一些功能 可配置项 nacos自带的ribbon负载均衡 OpenFegin 日志配置 设置超时时间 自定义拦截器 Nacos config 根据nacos上的配置文件获取
  • Spring6 框架学习

    Spring6 框架学习 1 Spring介绍 1 1 简介 2002年 Rod Jahnson 首次推出了 Spring 框架雏形interface21 框架 2004年3月24日 Spring 框架以 interface21 框架为基础
  • QObject: Cannot create children for a parent that is in a different thread

    一篇又臭又长的流水账 要看结论可以直接拉到最后 在一个项目中 需要使用串口接收外部的对射管状态 然后调用传感器 由于在之前的项目中 自制了一个带有UI的串口管理类 继承QDialog 最早在主线程中生成这个串口管理类 但是发现程序变得越来越
  • error Command failed with exit code 1.

    从传统JQuery转变到Node js最烦的就是一接手新项目就得npm install 浪费大量时间不说还总会报莫明其妙的错误 这次又遇到了一个error Command failed with exit code 1 因为它的相关处报的问
  • 100+国产大模型排行榜!部分超越ChatGPT-4

    国产大模型的发展速度惊人 至少说明在国内的显卡数量是足够多的 如果能集中资源 或许能快速跟进ChatGPT 不过 其中不少厂家号称已经超越ChatGPT 4 让人感到欣慰 觉得哪个好 评论区见
  • 【金融】新成立基金建仓时点、行业分布与市场行情关系探究

    需要进一步交流 获取数据和代码的同学欢迎私信奥 基于新成立基金建仓带入市场的巨量资金会推动市场行情这一逻辑 开展了一系列研究 首先提出了通过基金净值识别建仓行为 累计绝对值涨跌幅法 和通过基金 值识别建仓行为 法 的两种方法 在通过回顾历史
  • 一键修改分辨率bat_设置分辨率的批处理

    if computername name1 SETRES h800 v600 b32 f85 if computername name2 SETRES h1024 v768 b32 f85 if computername name3 SET
  • libevent服务端,单线程应用

    libevent版本 libevent 2 1 12 stable include
  • 数据库MySQL与SQLite

    常用数据库及Qt中的用法 一 常用数据库 数据库管理系统 DBMS 是旨在使用 检索和定义规则以验证和操作数据库中的数据的软件 有四种DBMS类型 关系型 面向对象型 分层型和网络型 有很多开源数据库 包括MySQL SQLite等 SQL
  • Android13 Windows11-VMware-Ubuntu 源码下载和全编译

    Windows11 VMware Ubuntu Android13 源码下载和全编译 官方教程文档 想用 Mac 编译源码的朋友基本可以放弃想法了 我试过了各种兼容错误 不得已用了 Windows 装 VMware Ubuntu 一 硬件配
  • 知道这20个正则表达式,能让你少写1,000行代码

    正则表达式 一个十分古老而又强大的文本处理工具 仅仅用一段非常简短的表达式语句 便能够快速实现一个非常复杂的业务逻辑 熟练地掌握正则表达式的话 能够使你的开发效率得到极大的提升 正则表达式经常被用于字段或任意字符串的校验 如下面这段校验基本
  • python3 [爬虫入门实战]scrapy爬取盘多多五百万数据并存mongoDB

    总结 虽然是第二次爬取 但是多多少少还是遇到一些坑 总的结果还是好的 scrapy比多线程多进程强多了啊 中途没有一次被中断过 此版本是盘多多爬取数据的scrapy版本 涉及数据量较大 到现在已经是近500万的数据了 1 抓取的内容 主要爬