scrapy框架的实现(重写)

scrapy框架携带cookie访问淘宝购物车功能的实现代码! scrapy框架简介 Scrapy是用纯Python实现一个为了爬取网站数据、提取结构性数据而编写的应用框架,用途非常广泛 框架的力量,用户只需要定制开发几个模块就可以轻松的实现一个爬虫,用来抓取网页内容以及各种图片,非常之方便 scrapy架构图 crapy Engine(引擎): 负责Spider、ItemPipeline、Downloader、Scheduler中间的通讯,信号、数据传递等。 Scheduler(调度器): 它负责接受引擎发送过来的Request请求,并按照一定的方式进行. 阅读详情
import requests
from lxml import etree
import threading
from time import sleep
from urllib.parse import urlparse
from queue import Queue
import redis

# 建立一个redis链接
rds = redis.StrictRedis(host="www.fanjianbo.com",port=6379,db=10)
# 分布式数据库中包含三个模块:items、start_urls、depefilter

# 【下载模块】
# 写一个装饰器给下载器增加重传功能
class retry(object):
    def __init__(self,max_retries=3,wait=3,exception=(Exception,)):
        super().__init__()
        self.max_retries = max_retries
        self.wait = wait
        self.exp = exception
    # 把__call__函数作为闭包的外部函数
    def __call__(self,f):
        # 定义一个内部函数
        def wrapper(*args,**kwargs):
            # 把外部函数的局部变量f作为一个函数来使用
            for i in range(self.max_retries):
                try:
                    res = f(*args,**kwargs)
                except self.exp as e:
                    print("异常:",e)
                    sleep(self.wait)
                    print("retries:%d"%(i+1))
                    continue
                else:
                    return res
        return wrapper

# 封装一个下载函数
@retry(4,2)
def fetch(url):
    print("正在请求:",url)
    # 发起请求
    res = requests.get(url=url,headers={"user-agent":'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'})
    # 判断下载是否成功
    if res.status_code == 200:
        # 把响应体返回出去
        return res.text
    else:
        print("下载失败,链接:%s无效"%url)
    return None

# 封装一个解析函数
def parse(html):
    try:
        tree = etree.HTML(html)
        # 取出当前页面上所有的a标签
        a_list = tree.xpath("//a")
        # 过滤获取到的a标签
        for a in a_list:
            # 取出title和href
            title = " ".join(a.xpath(".//text()"))
            href = a.xpath("./@href")[0] if a.xpath("./@href") else ""
            # https://主机.域名/路由路径...?参数1=值1&参数2=值2&.....#锚点
            # 把href分割开来,分成协议、主机.域名、路径、参数几个部分
            parse_url = urlparse(href)
            # print(parse_url)
            # ParseResult(scheme='https', netloc='m.sohu.com', path='/promotion', params='', query='posId=19990501&itemId=1000&link=Z0FitIhGq8uqu4NvHEp0wPQHyqXV4KngbIUGw6MfPkv4cgInluvxUnua1aOnw7r5sX5Ui0Uqsndj7eLeX85VikDuWnJhHZ8cOAFglIMOFgjQnONh2r4LHwUd5eMoor6YBozH45WVFzz1fD2RA61RjZLw8KqrysAm5v7E1dbuCQw%3D', fragment='')
            # 判断主机名是否符合要求
            loc = parse_url.netloc.strip() or "m.sohu.com"
            if loc == "m.sohu.com":
                # 过滤协议
                tmp = parse_url.scheme.strip()
                if tmp=="http" or tmp=="https":
                    scheme = tmp
                elif tmp == "":
                    scheme = "https"
                else:
                    continue
                # 过滤路径
                path = parse_url.path.strip()
                # 参数
                query = "?" + parse_url.query.strip() if parse_url.query.strip() else ""
                # 拼接url
                page_url = scheme + "://" + loc + path + query
                # print(page_url)
                # 将拼接好的符合要求的连接和它对应的title组合成字典返回出去
                yield {"title":title,"href":page_url}
    except Exception as e:
       print("解析异常:",e)



# 封装一个多线程调度模块
class Scheduler(threading.Thread):
    # def __init__(self,start_queue,depefilter_queue):
    def __init__(self):
        super().__init__()
        # self.start_urls = start_queue
        # self.depefilter_queue = depefilter_queue
    def run(self):
        while True:
            # 从start_urls中提取出起始url,并且调度下载器
            # url = self.start_urls.get()

            # 从redis的“sohu:start_urls”中提取
            url = rds.lpop("sohu:start_urls")

            # 调度下下载器之前要判断当前url是否在去重队列中
            # if url in self.depefilter_queue:
            # 从redis的“sohu:dupefilter”中取出所有的去重过的url来判断
            dupe_urls = rds.lrange("sohu:dupefilter",0,rds.llen("sohu:dupefilter"))
            if url in dupe_urls:
                continue
            try:
                html = fetch(url=url)
                # 如果调度成功,则加入到去重队列中
                # self.depefilter_queue.append(url)
                # 加入redis的"sohu:dupefilter"中
                rds.lpush("sohu:dupefilter",url)

                # 将html解析,将解析出来的那些当前页面的a标签的href属性取出来加入到start_urls队列
                for a in parse(html):
                    # self.start_urls.put(a["href"])  # 将新产生的url入队
                    rds.lpush("sohu:start_urls",a["href"])
                    # print(a)
                    save(a)
            except Exception as e:
                # 如果调度不成功,塞回去(放回起始队列)
                print("请求异常")
                # self.start_urls.put(url)
                rds.lpush("sohu:start_urls", url)
def save(data):
    rds.lpush("sohu:items",data)
    print("%s已经存入!"%data)
    pass

if __name__ == '__main__':
    start_url = "https://m.sohu.com/"
    # 定义一个队列,用于存储起始地址
    # start_queue = Queue()
    # 把起始url加入到调度队列
    # start_queue.put(start_url)

    # 把起始url加入到redis数据库中的start_urls中
    rds.lpush("sohu:start_urls",start_url)

    # 定义一个队列用于去重
    # depefilter_queue = []

    # 创建4个调度线程来调度下载器与解析器的工作
    # shedulers = [Scheduler(start_queue=start_queue,depefilter_queue=depefilter_queue) for i in range(4)]
    shedulers = [Scheduler() for i in range(4)]
    for s in shedulers:
        s.start()
Python爬虫之Scrapy框架系列(21)——重写媒体管道类实现保存图片名字自定义及多页爬取 阅读详情

相关推荐

中兴畅行60 ZTE 7552N 深度改造指南:从解锁BL到Magisk Root与IMEI硬改全流程

本文详细介绍了中兴畅行60(ZTE 7552N)的深度改造全流程,包括解锁BL、刷入Magisk获取Root权限以及IMEI硬改等关键步骤。通过专业的操作指南和实用技巧,帮助用户安全完成设备改造,同时提醒注意法律风险和技术难点。

weixin_33670786的博客 1896

Python爬虫Scrapy框架基础与实战项目案例

学习Python爬虫,怎能少了Scrapy框架?Scrapy框架是爬虫集大成者,让你享受框架带来的种种流畅和便利。本课程讲解爬虫相关基础,通过多个实际案例,深入浅出吃透Scrapy框架的架构原理及具体使用方法。学完本课程,你也就上手了Scrapy框架,能独立使用Scrapy框架爬取多数网站内容以及下载文件。----------------------------------------------------------------scarpy是分布式爬虫框架。——实现爬取网站数据、提取结构性数据而编写的应用框架,用途广泛。 框架的作用?相当于建高楼大厦,已经做好了框架结构,只需要根据具体需求和目标砌墙和搞装修就行啦。使用scarpy,就已经有了爬虫框架;只需要根据具体需求和目标,做好少部分模块,就可以很方便爬取到数据资源。 

R 分析裂区试验设计

裂区试验有主区部分和副区部分, 因而有主区部分误差(误差 a,简记为Ea )和副区部分误差(误差b,简记为Eb) 分别用于测验主区处理以及副区处理和主、副互作的显著性。对同一个二因素试验资料作自由度和平方和的分解,则可发现随机区组的误差项自由度和平方和分别为DFe、SSe,而裂区设计有两个误差项,其自由度和平方和分别为DFEa,DFEb, SSEa, SSEb。而区组,处理效应等各个变异项目的自由

samhuairen的专栏 8934

Scrapy系列二:重写start_reuests()方法,伪装和重设解析数据回调函数

为什么要伪装:因为有很多网站是拒绝爬虫访问,所以要使用Request对象把爬虫伪装成浏览器访问 重设解析数据回调函数:在系列一文章里面我们把爬虫的数据解析的具体实现写在了Scrapy默认的parse方法里,如果要指定别的数据解析回调函数,则需要指定新的解析数据的回调函数 重写start_requests()方法 在系列一的基础上修改 qidian_headers,User-Ag...

qq_41622603的博客 1764

从ADS到HFSS:耦合线带通滤波器的设计与模型转换实战

本文详细介绍了耦合线带通滤波器的完整设计流程,重点阐述了从ADS电路级快速优化到HFSS三维电磁场精确验证的模型转换实战方法。通过对比ADS理想模型仿真与HFSS全波仿真结果,指导读者进行参数校准与迭代优化,并分享了关键的板材选择、加工误差及端口设置等避坑指南,确保设计性能与实物测试高度一致。

weixin_29290863的博客 344

AnolisOS网卡驱动源码编译与安装实战指南

本文提供了一份详尽的AnolisOS网卡驱动源码编译与安装实战指南。针对系统自带通用驱动不兼容导致网络无法使用的问题,文章从环境准备、源码获取、编译安装到新旧驱动替换与持久化配置,一步步解析了如何通过源码编译安装官方驱动,解决硬件兼容性问题,并确保驱动在系统重启后自动生效。

weixin_28358083的博客 304

scrapy 方法,函数,及一些参数

目录 相对链接url 变绝对链接: Selector(response=response.text): extract() 与 extract_first(): isinstance(item,BooksSpiderItem) Request(url[,callback,method,headers,body,cookies,meta,encoding,priority,dont_fi...

木下瞳的博客 995

深入解析CAN2.0A与CAN2.0B协议:帧格式与通信机制对比

本文深入对比了CAN2.0A与CAN2.0B协议的核心差异,重点解析了11位标准帧与29位扩展帧的帧格式、标识符长度及通信机制。文章阐述了CAN2.0B向下兼容的特性,并探讨了在汽车电子、工业控制等复杂网络中,如何根据项目需求、兼容性及实时性要求,在标准帧与扩展帧之间做出合理选择。

weixin_29163797的博客 394

Scrapy框架之重写下载器中间件

先附一张图, 了解一下思路:红线是原本的路线, 紫色是修改后的路线.在文件中, 自定义一个中间件.class CustomMiddleware(object): process_request(request, spider)当每个request通过下载中间件时,该方法被调用。process_request() 必须返回其中之一: 返回 None 、返回一个Response 对象、返回一个 Req...

塔克米的博客 2751

SpringBoot3 + OAuth2.1实战:5分钟搞定授权码模式(含完整代码)

本文详细介绍了如何在SpringBoot3环境中快速实现OAuth2.1的授权码模式,包括环境配置、核心安全实现及完整代码示例。通过Spring Security集成,开发者可以高效构建企业级安全认证系统,解决版本兼容性问题,提升开发效率。

weixin_29216353的博客 140

ROS智能车定位导航仿真+功能包自带的地图实现+自己建立的地图实现

ROS智能车定位导航仿真一、前言二、效果图三、准备工作[1.在Ubuntu上安装ROS Kinetic](https://blog.youkuaiyun.com/qq_42585108/article/details/104327661)2.创建ROS工作区间①1创建racecar_ws和src文件夹②初始化工作空间③下载racecar源代码包,并编译工程四、启动仿真1.设置环境变量2.启动地图五、建图1.启动slam和rviz2 控制车辆(左侧有个控制窗口),WASD控制前左后右的运动就可以建图了:3.新建终端保存地

qq_42585108的博客 1万+

Scrapy 下载多层请求、多页图片 (重写get_media_requests、file_path方法)

Scrapy 下载多层请求、多页图片 (重写get_media_requests、file_path方法)

Syc1102g的博客 1103

从ST电机库到TI InstaSPIN:手把手对比两种主流FOC实现中的坐标变换差异

本文深入对比了ST电机库与TI InstaSPIN在FOC实现中的坐标变换差异,包括坐标系定义、变换系数和角度处理等关键点。针对BLDC和PMSM电机控制,提供了从理论到实践的移植方案,帮助工程师快速解决平台切换中的性能问题。特别解析了Clarke/Park变换在两种实现中的微妙差异及其对PI控制的影响。

weixin_28724661的博客 398

scrapy框架Images Pipeline下载图片(重写方法来指定下载位置)

使用scrapy框架下载图片 先介绍一下os模块: import os即可 使用os.path.dirname (__ file__) 可以查看当前文件所在的目录,以如下目录为例: 使用os.path.dirname(__ file__)得到的是第二个bmw(即蓝色框下面的那个)目录,假如我们想要在第一个bmw下面创建一个images文件夹,应该怎么做呢? 所以我们使用os.path.dirname(os.path.dirname(file))语句,如此得到的就是第二个bmw所在的目录了(也就是第一个

qq_39579087的博客 1450

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

爬虫scrapy实现登录

如果我们的spider类中,没有 start_requests 方法就会调用父类的方法,如果此类中存在了start_requests 方法,那么类中的方法就不会被调用,除非我们手动调用。 因为我们要做登录,所以我们要重写start_requests start_requests 是我们开始启动spider.py的时候最先被调用的,所以登录的url要在这个方法里面请求 之后调用父类的方法 ...

panjunxiao的博客 1121

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Scrapy的日志信息与配置

Scrapy的日志信息与配置1. 了解scrapy的日志信息2. scrapy的常用配置3. scrapy_redis配置4. scrapy_splash配置5. scrapy_redis和scrapy_splash配合使用的配置5.1 原理5.2 重写dupefilter去重类,并在settings.py中使用5.2.1 重写去重类5.2.2 scrapy_redis和scrapy_splash配合使用的配置6. 了解scrapy的其他配置7. 小结 学习目标: 了解 scrapy的日志信息 掌握 sc

全网粉丝30W+,优快云、稀土掘金人工智能领域签约作者,人工智能、大模型、Python 爬虫,商务合作,请私信沟通。 855

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Scrapy爬虫——壁纸爬虫

说在前面: 今天把之前写过的壁纸爬虫拿出来用了一下,发现是很久以前写过的,用的还是python基本库urllib去做网络请求的,正好最近在学scrapy,于是就用scrapy框架重新写了一遍。 环境要求: python:3.6 Scrapy:1.51 正式开始: 感谢壁纸来源Wallhaven 网页分析 ...

diansu6820的博客 192

[【重磅推荐】Scrapy爬虫框架如何重写FilesPipeline或ImagesPipeline的(file_path方法)下载文件或图片自定义文件名

一:文件下载的配置文件:  setting.py文件配置选项 文件下载保存路径(重写了FilesPipeline默认输出路径:file_dir) FILES_STORE = 'download' ITEM_PIPELINES = { 文件的FilesPipeline必须设置为1,最先执行! 'scrapy_first.pipelines.MyFilesPipeline': 1...

weixin_43343144的博客 4090

Scrapy框架-CrawlSpider

目录 1.CrawlSpider介绍 2.CrawlSpider源代码 3. LinkExtractors:提取Response中的链接 4. Rules 5.重写Tencent爬虫 6. Spider和CrawlSpider的区别 1...

weixin_30810239的博客 186

scrapy-redis

Scrapy 和 scrapy-redis的区别 Scrapy 是一个通用的爬虫框架,但是不支持分布式,Scrapy-redis是为了更方便地实现Scrapy分布式爬取,而提供了一些以redis为基础的组件(仅有组件)。 pip install scrapy-redis Scrapy-redis提供了下面四种组件(components):(四种组件意味着这四个模块都要做相应...

anbingzhong1132的博客 119

在爬虫框架scrapy中使用selenium

1. wangyi.py import scrapy from selenium import webdriver ''' 在scrapy中使用selenium的编码流程: 1.在spider的构造方法中创建一个浏览器对象(作为当前spider的一个属性) 2.重写spider的一个方法closed(self,spider),在该方法中执行浏览器关闭的操作 3.在下载中...

数据知道的博客 3万+

11 Scrapy框架之递归解析和post请求

一.递归爬取解析多页页面数据   - 需求:将糗事百科所有页码的作者和段子内容数据进行爬取切持久化存储   - 需求分析:每一个页面对应一个url,则scrapy工程需要对每一个页码对应的url依次发起请求,然后通过对应的解析方法进行作者和段子内容的解析。   实现方案:   1.将每一个页码对应的url存放到爬虫文件的起始url列表(start_urls)中。(不推荐) ...

weixin_30875157的博客 126

Scrapy 关于Request对象

Request对象由start_requests()调用make_requests_from_url() 生成Request对象,要修改最初爬取某个网站的Request对象,可以重写start_requests()方法(但重写必须返回一个可迭代对象,一般为生成器,此方法只会在spider启动爬取并且未制定URL时调用一次)。例如,如果需要在启动时以POST登陆某个网站,可以写成: class My...

weixin_44732765的博客 436

Python之scrapy的post请求、日志和代理

1、重写方法: 2、start_requests的返回值: 使用 testpost.py 日志级别:默认的日志等级是DEBUG ,只要出现了DEBUG或者DEBUG以上等级的日志 ,那么这些日志将会打印settings.py文件设置:默认的级别为DEBUG,会显示上面所有的信息。在配置文件中 settings.py1、中,打开选项 2、中使用代理...

Lifelong learning 4460

python中scrapy框架实现分类下载保存

python—scrapy_Pipelines分类下载 此处以图片下载为例 1. items中添加images参数储存图片的相关信息…如:路径,下载的url,图片的效验码。 car_cat_name = scrapy.Field() # 此处保存图片的类别 images = scrapy.Field() # 储存图片的相关信息(如:路径,下载的url,图片的效验码) 需要额外定义 image...

weixin_44750138的博客 518

爬虫2.4-scrapy框架-图片分类下载

目录 scrapy框架-图片下载 1 传统下载方法: 2 scrapy框架的下载方法 3 分类下载完整代码 scrapy框架-图片下载 python小知识: map函数:将一个可迭代对象的每个值,依次交给一个函数处理,返回一个生成器。 urls = ...

weixin_30505751的博客 156
上一篇: 分布式爬虫的部署(scrapy_redis)
下一篇: python中类的演变
Are you ready
博客等级 码龄8年 312粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值