用Scrapy抓取当当网站数据

setting.py实验目的及要求:

实验目的

     通过本实验了解Scrapy爬虫框架;熟练掌握Scrapy的基本使用方法和常用技巧。

实验要求

     使用Scrapy框架,抓取网站商品信息(京东、淘宝、当当等任选一个),并将结果保存成多种形式。(本文选择当当)

实验原理及内容:

实验原理】(列出相关知识点)

  1. Scrapy框架:
    • 理解Scrapy框架的基本原理和架构。
  2. HTTP请求和响应:
    • 理解HTTP请求和响应的基本概念。
    • 如何通过Scrapy发送HTTP请求和处理响应。
  3. Web页面结构:
    • 了解HTML和CSS的基础知识,理解Web页面的结构。
  4. CSS选择器和XPath:
    • 使用CSS选择器或XPath在网页中定位和提取信息。
  5. Scrapy Spider:
    • 创建Scrapy Spider,定义如何抓取和解析页面。
    • 如何通过Spider跟踪链接和处理分页。
  6. Scrapy Items:
    • 定义Scrapy Items,用于存储抓取的数据。
  7. Scrapy Pipelines:
    • 编写Scrapy Pipelines处理抓取到的Item。
    • 配置Pipeline在settings.py中。
  8. 异常处理:
    • 处理可能出现的异常,例如超时、连接错误等。
  9. 数据存储:
    • 将抓取到的数据保存到不同的存储介质,如文件、数据库等。
  10. 用户代理和IP代理:
    • 设置和使用用户代理和IP代理,以避免被封禁。
  11. 异步和并发:
    • 配置异步和并发请求以提高爬取效率。
  12. Scrapy Settings:
    • 配置Scrapy的Settings,包括用户代理、下载延迟等。
  13. Web爬取伦理:
    • 了解爬虫的伦理和法律问题,避免对网站造成不必要的压力。
  14. 日志和调试:
    • 使用Scrapy的日志系统进行调试。
  15. 扩展和定制:
    • 定制和扩展Scrapy,满足特定需求。

程序思路

  1. 首先,因为我们要抓取网页中的标题、链接和评论数,所以我们首先得写items.py
  2. 在这里添加完我们需要爬取的哪些数据后,我们在转向我们的爬虫文件,我们通过 scrapy genspider dd dangdang.com 创建了一个爬虫文件dd.py
  3. 然后开始撰写settings.py
  4. 最后编写pipelines.py文件了(也就是可以正式操作数据了)。

 实验数据与结果分析:(含运行结果截屏)

【实验结果】

【结果分析】

         利用Scrapy框架抓取了当当网站商品信息,并通过ppline.py将数据存储到了mysql数据库中,可以以不同数据存储方式存储。

实验小结:(包括问题和解决方法、心得体会、意见与建议等)

         在进行这个实验的过程中,我首先面临的挑战是网站结构的变化。由于当当网站可能会定期更新,导致之前编写的爬虫代码无法正确提取信息。为了解决这个问题,我学习了如何动态调整选择器以适应变化的网页结构,并通过查看网页源代码来快速调整选择器,确保爬虫的准确性。

         在实验中,我深刻体会到Scrapy框架的强大之处。通过定义Item、编写Spider、配置Pipeline等步骤,我成功地构建了一个功能强大的爬虫,能够高效地抓取和处理目标网站的信息。学会使用Scrapy的中间件和设置,我更好地掌握了爬虫的并发和异步请求的处理方式,提高了爬取效率。

         通过实验,我还发现了对数据进行实时分析和监控的重要性。及时发现并解决异常情况,如数据缺失、异常格式等,有助于提高爬虫的稳定性。此外,通过对数据进行统计和可视化分析,我更全面地了解了抓取到的信息,发现了一些潜在的趋势和规律。通过这个实验,我不仅掌握了Scrapy框架的使用,还培养了解决实际问题的能力,让我受益匪浅。

实验源代码清单:(带注释)

item.py:

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

import scrapy

class DangdangItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    title = scrapy.Field()
    link = scrapy.Field()
    price = scrapy.Field()
    shop = scrapy.Field()
# Scrapy settings for dangdang project
#
# For simplicity, this file contains only settings considered important or
# commonly used. You can find more settings consulting the documentation:
#
#     https://docs.scrapy.org/en/latest/topics/settings.html
#     https://docs.scrapy.org/en/latest/topics/downloader-middleware.html
#     https://docs.scrapy.org/en/latest/topics/spider-middleware.html

BOT_NAME = 'dangdang'

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

# Crawl responsibly by identifying yourself (and your website) on the user-agent
USER_AGENT = {
      'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36',
}
# Obey robots.txt rules
ROBOTSTXT_OBEY = False
LOG_LEVEL = 'ERROR'

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

# Configure a delay for requests for the same website (default: 0)
# See https://docs.scrapy.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 https://docs.scrapy.org/en/latest/topics/spider-middleware.html
#SPIDER_MIDDLEWARES = {
#    'dangdang.middlewares.DangdangSpiderMiddleware': 543,
#}

# Enable or disable downloader middlewares
# See https://docs.scrapy.org/en/latest/topics/downloader-middleware.html
DOWNLOADER_MIDDLEWARES = {
   'dangdang.middlewares.DangdangDownloaderMiddleware': 543,
}

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

# Configure item pipelines
# See https://docs.scrapy.org/en/latest/topics/item-pipeline.html
ITEM_PIPELINES = {
   'dangdang.pipelines.DangdangPipeline': 300,
}

# Enable and configure the AutoThrottle extension (disabled by default)
# See https://docs.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 https://docs.scrapy.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'

Pipline.py

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

# useful for handling different item types with a single interface
#from itemadapter import ItemAdapter
#from pymongo import MongoClient

class DangdangPipeline:
    def __init__(self):
        self.client = MongoClient(host='localhost',port=27017)
        self.db = self.client['当当']
        self.collections = self.db['python爬虫']

    def process_item(self, item, spider):
        data = {
            'title': item['title'],
            'link': item['link'],
            'price': item['price'],
            'shop': item['shop'],
        }
        print(data)
        self.collections.insert(data)
        return item

dd.py

import scrapy
from dangdang.items import DangdangItem

class DdSpider(scrapy.Spider):
    name = 'dd'
    # allowed_domains = ['www.dangdang.com']
    start_urls = ['http://search.dangdang.com/?key=python%C5%C0%B3%E6&act=input&page_index=1']

    def parse(self, response):
        item = DangdangItem()
        li_lists = response.xpath('//*[@id="component_59"]/li')
        for li_list in li_lists:
            title = li_list.xpath('./p[1]/a/@title').extract()[0]
            link = 'http:'+li_list.xpath('./p[1]/a/@href').extract()[0]
            price = li_list.xpath('./p[3]/span/text()').extract()[0]
            shop = li_list.xpath('./p[4]/a/text()').extract()[0]
            item['title'] = title
            item['link'] = link
            item['price'] = price
            item['shop'] = shop
            # print(title)
            # print(link)
            # print(price)
            # print(shop)
            # print('*'*100)
            yield item

        for page in range(2,101):
            url = f'http://search.dangdang.com/?key=python%C5%C0%B3%E6&act=input&page_index={page}'
            result = scrapy.Request(url,callback=self.parse)
            yield result

项目总结构为:

               

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/550769.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

实战 K8s ConfigMap:打造动态可配置的云原生应用

🐇明明跟你说过:个人主页 🏅个人专栏:《Kubernetes航线图:从船长到K8s掌舵者》 🏅 🔖行路有良友,便是天堂🔖 目录 一、前言 1、k8s简介 2、ConfigMap简介 二、Con…

社交创新的标杆:解读Facebook的社交模式

引言 在当今数字化时代,社交媒体已成为人们日常生活和沟通的重要工具。作为全球最大的社交媒体平台,Facebook不仅改变了我们的社交模式,而且对全球的社交文化、商业活动和公共事务产生了深远的影响。本文将深入探讨Facebook的社交模式&#…

面试:lock 和 synchronized

一、语法层面 synchronized 是关键字,源码在jvm中,用c语言实现Lock 是接口,源码由jdk提供,用java语言实现使用synchronized时,退出同步代码块锁会自动释放,而使用Lock时,需要手动调用unlock方法…

数学建模完整版

模型与适用题型 微分方程传染病预测模型 神经网络 层次分析法 粒子群算法 matlab 优劣解距离法

停车资产数字化运营管理方案内容包括哪些?

随着新兴信息技术的蓬勃发展,如大数据、云服务、机器学习以及数字孪生等,停车行业正经历着前所未有的变革。这些技术的应用不仅推动了智慧停车领域的迅猛扩张,而且已成为全球各地数字化城市构建和城市治理现代化的关键驱动力。在数字化、平台…

【可实战】测试体系与测试方案设计(业务按公司实际情况,技术可参考通用测试方案)

一、如果我们要测试一个系统,首先我们要了解被测系统的架构 (一)业务架构-从需求里面去了解(角色和行为): 业务模型分析(是一个电商,还是一个企业的crm,还是一个网站&a…

java的volatile

在Java中,线程之间对内存写入操作的可见性是一个重要的问题,因为每个线程都有自己的工作内存,并且线程之间共享主内存。当一个线程修改了共享变量的值,其他线程并不一定能立即看到这个修改,这就是所谓的可见性问题。 例…

STM32H7 QSPI的寄存器和功能介绍

目录 概述 1 认识QSPI 1.1 QSPI介绍 1.2 QUADSPI 主要特性 2 QUADSPI 功能说明 2.1 双闪存模式禁止 2.2 双闪存模式使能 3 QUADSPI 的用法 3.1 间接模式的操作步骤 3.1.1 QUADSPI 间接模式时配置帧模式 3.1.2 写控制寄存器 (QUADSPI_CR) 3.1.3 写通信配置寄存器 (…

6-pytorch - 网络的保存和提取

前言 我们训练好的网络,怎么保存和提取呢? 总不可以一直不关闭电脑吧,训练到一半,想结束到明天再来训练,这就需要进行网络的保存和提取了。 本文以前面博客3-pytorch搭建一个简单的前馈全连接层网络(回归问…

树和二叉树(一)

一、树 非线性数据结构,在实际场景中,存在一对多,多对多的情况。 树( tree)是n (n>0)个节点的有限集。当n0时,称为空树。 在任意一个非空树中,有如下特点。 1.有且仅有一个特定的称为根的节点…

数字IPO:企业增长的新引擎

数字IPO作为一种新型融资方式,可以被视为企业增长的重要加速器。以下是数字IPO如何促进企业增长的几个关键方面: 1.低成本融资与知名度提升:相较于传统的借贷融资方式,数字IPO为企业提供了低成本的资金来源。同时,上市…

神经网络--反向传播算法推导

神经网络–反向传播算法推导 文章目录 神经网络--反向传播算法推导概述神经网络模型反向传导算法 概述 以监督学习为例,假设我们有训练样本集 ( x ( i ) , y ( i ) ) (x^{(i)},y^{(i)}) (x(i),y(i)),那么神经网络算法能提供一种复杂且非线性的假设模型 …

MySQL与Redis缓存一致性的实现与挑战

缓存是提高应用性能的重要手段之一,而 MySQL 和 Redis 是两种常用的数据存储和缓存技术。在许多应用中,常常将 Redis 用作缓存层,以加速对数据的访问。然而,在使用 MySQL 和 Redis 组合时,保持缓存与数据库之间的一致性…

【MATLAB源码-第54期】基于白鲸优化算法(WOA)和遗传算法(GA)的栅格地图路径规划最短路径和适应度曲线对比。

操作环境: MATLAB 2022a 1、算法描述 1.白鲸优化算法(WOA): 白鲸优化算法是一种受白鲸捕食行为启发的优化算法。该算法模拟了白鲸群体捕食的策略和行为,用以寻找问题的最优解。其基本思想主要包括以下几点&#xff…

FMEA赋能可穿戴设备:打造安全可靠的未来科技新宠!

在科技日新月异的今天,可穿戴设备已成为我们生活中不可或缺的一部分。它们以其便携性、智能化和个性化的特点,深受消费者喜爱。然而,随着可穿戴设备市场的快速扩张,其安全性和可靠性问题也日益凸显。为了确保产品质量,…

QT常量中有换行符解决方法--使用中文显示乱码或者编译报错

QT6.3常量中有换行符 int ret2QMessageBox::information(this,QString::fromLocal8Bit("提示"),QString::fromLocal8Bit(("确认启动设备吗?")),QMessageBox::Yes,QMessageBox::No); 确保显示正常,建议每次使用时,中文的前后加一个空…

从零开始写 Docker(十一)---实现 mydocker exec 进入容器内部

本文为从零开始写 Docker 系列第十一篇,实现类似 docker exec 的功能,使得我们能够进入到指定容器内部。 完整代码见:https://github.com/lixd/mydocker 欢迎 Star 推荐阅读以下文章对 docker 基本实现有一个大致认识: 核心原理&…

在线音乐网站的设计与实现

在线音乐网站的设计与实现 摘 要 在社会和互联网的快速发展中,音乐在人们生活中也产生着很大的作用。音乐可以使我们紧张的神经得到放松,有助于开启我们的智慧,可以辅助治疗,达到药物无法达到的效果,所以利用现代科学…

优秀Burp插件 提取JS、HTML中URL插件

Burp Js Url Finder 攻防演练过程中,我们通常会用浏览器访问一些资产,但很多接口/敏感信息隐匿在html、JS文件中,通过该Burp插件我们可以: 1、发现通过某接口可以进行未授权/越权获取到所有的账号密码 2、发现通过某接口可以枚举用…

STM32的GPIO端口的八种模式解析

目录 STM32的GPIO端口的八种模式解析 一、上拉输入模式 二、下拉输入模式 三、浮空输入模式 四、模拟输入模式 五、推挽输出模式 六、开漏输出模式 七、复用推挽输出模式 八、复用开漏输出模式 STM32的GPIO端口的八种模式解析 在学习STM32的过程中,GPIO端口…
最新文章