python爬虫之用scrapy下载中间件爬取网易新闻

news2024/11/26 8:49:42

python爬虫之用scrapy下载中间件爬取网易新闻

相关资源如下:
采用scrapy下载中间件爬取网易新闻国内、国际、数读、军事、航空五大板块新闻标题和内容

程序wangyi.py主代码:

import scrapy
from selenium import webdriver
from selenium.webdriver.edge.service import Service
from wangyiPro.items import WangyiproItem

class WangyiPySpider(scrapy.Spider):
    name = "wangyi.py"
    # allowed_domains = ["www.xxx.com"]
    start_urls = ["https://news.163.com/"]
    models_url = []     #存储五个板块对应详情页的url
    #解析五大板块对应详情页的url

    #实例化一个浏览器对象
    def __init__(self):
        service = Service('D:\PycharmProjects\Scrapykuangjia\msedgedriver.exe')
        self.bro = webdriver.Edge(service=service)
    def parse(self, response):
        li_list = response.xpath('//*[@id="index2016_wrap"]/div[3]/div[2]/div[2]/div[2]/div/ul/li')
        alist = [2, 3, 4, 5, 6]
        for index in alist:
            model_url = li_list[index].xpath('./a/@href').extract_first()
            self.models_url.append(model_url)

        #依次对每一个板块对应的页面进行请求
        for url in self.models_url:#对每一个板块的url进行请求发送
            yield scrapy.Request(url,callback=self.parse_model)

    #每一个板块对应的新闻标题相关的内容都是动态加载
    def parse_model(self,response):#解析每一个板块页面中对应新闻的标题和新闻详情页的url
        # response.xpath()
        div_list = response.xpath('/html/body/div/div[3]/div[3]/div[1]/div[1]/div/ul/li/div')
        for div in div_list:
            title = div.xpath('./div/div[1]/div/h3/a/text()').extract_first()
            new_detail_url = div.xpath('./div/div[1]/div/h3/a/@href').extract_first()

            item = WangyiproItem()
            item['title'] = title

            #对新闻详情页的url发起请求
            yield scrapy.Request(url=new_detail_url,callback=self.parse_detail,meta={'item':item})
    def parse_detail(self,response):#解析新闻内容
        content = response.xpath('//*[@id="content"]/div[2]//text()').extract()
        content = ''.join(content)
        item = response.meta['item']
        item['content'] = content

        yield item

    def closed(self,spider):
        self.bro.quit()

items.py

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

import scrapy


class WangyiproItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    title = scrapy.Field()
    content = scrapy.Field()

middlewares.py

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

from scrapy import signals

# useful for handling different item types with a single interface
from itemadapter import is_item, ItemAdapter
from scrapy.http import HtmlResponse
from time import sleep
class WangyiproDownloaderMiddleware:
    # Not all methods need to be defined. If a method is not defined,
    # scrapy acts as if the downloader middleware does not modify the
    # passed objects.



    def process_request(self, request, spider):
        # Called for each request that goes through the downloader
        # middleware.

        # Must either:
        # - return None: continue processing this request
        # - or return a Response object
        # - or return a Request object
        # - or raise IgnoreRequest: process_exception() methods of
        #   installed downloader middleware will be called
        return None
    #该方法拦截五大板块对应的响应对象,进行修改
    def process_response(self, request, response, spider):#spider爬虫对象
        bro = spider.bro#获取了在爬虫类中定义的浏览器对象
        #挑选出指定的响应对象进行修改
        #通过url指定request
        #通过request指定response
        if request.url in spider.models_url:
            bro.get(request.url)#五个板块对应的url进行请求
            sleep(2)
            page_text = bro.page_source     #包含了动态加载的新闻数据
            # response#五大板块对应的响应对象
            #针对定位到的这些response进行篡改
            #实例化一个新的响应对象(符合需求,包含动态加载出的新闻数据),替代原来旧的响应对象
            #如何获取动态加载出的新闻数据?
                #基于selenium便捷的获取动态加载数据
            new_response = HtmlResponse(url=request.url,body=page_text,encoding='utf-8',request=request)
            return new_response
        else:
            # response#其他请求对应的响应对象
            return response



    def process_exception(self, request, exception, spider):
        # Called when a download handler or a process_request()
        # (from other downloader middleware) raises an exception.

        # Must either:
        # - return None: continue processing this exception
        # - return a Response object: stops process_exception() chain
        # - return a Request object: stops process_exception() chain
        pass


pipelines.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


class WangyiproPipeline:
    def process_item(self, item, spider):
        print(item)
        return item

settings.py

# Scrapy settings for wangyiPro 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 = "wangyiPro"

SPIDER_MODULES = ["wangyiPro.spiders"]
NEWSPIDER_MODULE = "wangyiPro.spiders"


# Crawl responsibly by identifying yourself (and your website) on the user-agent
USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36 Edg/116.0.1938.76"

LOG_LEVEL = "ERROR"

# Obey robots.txt rules
ROBOTSTXT_OBEY = False

# 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 = {
#    "wangyiPro.middlewares.WangyiproSpiderMiddleware": 543,
#}

# Enable or disable downloader middlewares
# See https://docs.scrapy.org/en/latest/topics/downloader-middleware.html
DOWNLOADER_MIDDLEWARES = {
   "wangyiPro.middlewares.WangyiproDownloaderMiddleware": 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 = {
   "wangyiPro.pipelines.WangyiproPipeline": 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"

# Set settings whose default value is deprecated to a future-proof value
REQUEST_FINGERPRINTER_IMPLEMENTATION = "2.7"
TWISTED_REACTOR = "twisted.internet.asyncioreactor.AsyncioSelectorReactor"
FEED_EXPORT_ENCODING = "utf-8"

运行后结果如下:
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PDF——分割pdf的10个工具

PDF分割器是一种可用于将PDF文档分割成更小的文档甚至单个页面的工具。分割 PDF 文档的主要原因是为了更容易共享。 但该过程的成功取决于您用于拆分 PDF 的工具。较简单的工具仅提供几个选项,可能并不适合所有类型的文档。我们将在本文中列出的 10 个最佳 PDF 分割…

gemini api 应用

安装 gemini Prerequisites To complete this quickstart locally, ensure that your development environment meets the following requirements: Python 3.9 An installation of jupyter to run the notebook. Install the Gemini API SDK The Python SDK for the Gemin…

手机在网时长查询接口如何对接?(一)

一、什么是手机在网时长查询接口? 传入手机号码,查询该手机号的在网时长,返回时间区间,支持携号转网号码查询。 二、手机在网时长查询接口适用于哪些场景? 例如:客户画像与精准营销 (1&…

2个一键生成PPT目录的AI软件,轻松搞定PPT目录制作!

在各种信息都在努力争夺每个人的注意力的当下,一份精心制作的PPT可能成为决定成败的关键因素。而PPT目录,作为整个PPT演示文稿的门面和导航,其重要性往往被低估。 每个人的时间都是有限的,如果PPT目录没有让潜在观众Get到重点&am…

Vue常见问题(一)组件的使用

Failed to resolve component. 报错原因: 组件注册错误:我们在组件中使用了未注册的组件。在Vue中,组件必须先注册才能使用。 解决方法: 引用组件 : import ItemPage from "/components/itemPage.vue";…

Python NumPy数组维度和坐标轴的含义(ndarray demension axis)

Numpy是Python中科学计算的基础包,而其核心对象就是ndarray(n维数组)。关于如何创建n维度数组可以参考下面的文章: Python NumPy数组的创建方法 为了对ndarray进行数学处理,很多函数中都要指定一个叫做坐标轴的参数(a…

创建Apple开发者ID及ABM账号教程

申请苹果开发者账号和ABM (Apple Business Manager) 账号,以便在iPhone(IOS平台)上发布和管理汽应用。申请需要遵循一系列步骤。以下是详细的申请流程: 一、苹果开发者账号申请流程 1. 注册Apple ID - 访问…

打卡第34天------动态规划

我目前刷leetcode上的题的时候,不仅每天按照代码随想录的算法训练营的进度来刷题,也会自己开始在leetcode上刷题了,有些简单的题目,不用看题解就能做出来了,这也是一种进步呀。希望可以尽快找到下家工作单位,分秒必争,不浪费自己的一分一毫时间,与时间赛跑的过程呀。 一…

文心一言 VS 讯飞星火 VS chatgpt (319)-- 算法导论22.3 11题

十一、请解释有向图的一个结点u怎样才能成为深度优先树中的唯一结点,即使结点u同时有入边和出边。如果要写代码,请用go语言。 文心一言: 在一个有向图中,如果结点u在深度优先搜索(DFS)的过程中成为深度优…

【面试高频,必知必会】OpenGL渲染流程

😎 作者介绍:欢迎来到我的主页👈,我是程序员行者孙,一个热爱分享技术的制能工人。计算机本硕,人工制能研究生。公众号:AI Sun(领取大厂面经等资料),欢迎加我的…

建议收藏:如何快速搭建一套仓库管理系统?

在工作中碰到仓库出错或因统计繁琐而加班到天亮都是常有的事情,工作效率真的很低。我相信这种的困境,不少同行朋友定能深有体会! 实话说,我们公司之前也曾尝试斥巨资引入传统仓库管理系统,但效果却不尽人意。不仅操作…

面试中的算法 [ 持续更新中 ] 基于Python语言 如何判断链表有环

本文主要介绍了如何判断链表有环的问题,并进行了延伸: 如果链表有环如何求出环的长度,入环节点... ...嗯,点个赞总可以不!!! 目录 5.1如何判断链表有环 5.1.1 有一个单向链表,链表…

动态规划之——背包DP(进阶篇)

文章目录 概要说明多重背包(朴素算法)模板例题思路code 多重背包(二进制优化)模板例题思路code 多重背包(队列优化)模板例题思路 混合背包模板例题思路code1code2 二维费用背包模板例题思路code 概要说明 本文讲多重背包、混合背包以及二维费用背包&…

汇聚行业实践,树立应用典范——《Serverless应用实践案例集》重磅发布

云计算已经成为数字时代的基础设施,借助其规模效应实现资源的集约化利用,最大化发挥计算的价值。Serverless进一步优化了云服务供给模式,简化了云上应用的构建方式,代表了云计算的重要发展趋势。 2024年7月24日,2024可…

【Java】二维码生成工具

一、引入相关依赖 <!-- 引入Hutool工具库&#xff0c;简化Java开发&#xff0c;提高开发效率 --> <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.7.5</version> </dependency&…

LearnOpenGL之摄像机

前序 AndroidLearnOpenGL是本博主自己实现的LearnOpenGL练习集合&#xff1a; Github地址&#xff1a;https://github.com/wangyongyao1989/AndroidLearnOpenGL 系列文章&#xff1a; 1、LearnOpenGL之入门基础 2、LearnOpenGL之3D显示 3、LearnOpenGL之摄像机 4、LearnOpenG…

UNION ALL 在单个子查询中排序不生效问题

业务场景 有两张表&#xff1a;表A&#xff0c;和表B&#xff0c;需要对A中数据按排序字段排序&#xff0c;对B表也按排序字段排序&#xff0c;然后返回并集。 写出如下SQL&#xff08;已简化&#xff09;&#xff1a; (select id from A order by sort desc) union all (se…

《python语言程序设计》2018年版第6章31题调用time.time()返回从1970年1月1日0点开始显示当前日期和时间

我没按要求显示结果。但是内容差不都&#xff0c;关键。每个31日或者月底就时间出现偏差 # 之前已经做好的当前的小时、分、秒。 def currentTime_output():currentTime time.time()totalSeconds int(currentTime)currentSecond totalSeconds % 60totalMinutes totalSecon…

正点原子imx6ull-mini-Linux驱动之Linux USB 驱动实验

USB 是很常用的接口&#xff0c;目前大多数的设备都是 USB 接口的&#xff0c;比如鼠标、键盘、USB 摄像 头等&#xff0c;我们在实际开发中也常常遇到 USB 接口的设备&#xff0c;本章我们就来学习一下如何使能 Linux 内核自带的 USB 驱动。注意&#xff01;本章并不讲解具体的…

本阿弗莱克和詹妮弗洛佩兹两次婚恋的完整时间表 每次都轰轰烈烈也都无疾而终

本阿弗莱克和詹妮弗洛佩兹于 2002 年在《鸳鸯绑匪》片场首次相识&#xff0c;当时洛佩兹与她的第二任丈夫克里斯贾德于 2001 年 9 月结婚。当时&#xff0c;阿弗莱克与格温妮丝帕特洛分分合合。洛佩兹提出离婚&#xff0c;不久后与阿弗莱克首次亮相情侣档。 2002 年 11 月&…