Scrapy框架进阶攻略:代理设置、请求优化及链家网实战项目全解析

news2024/12/25 2:24:56

scrapy框架

加代理

付费代理IP池

middlewares.py

# 代理IP池
class ProxyMiddleware(object):
    proxypool_url = 'http://127.0.0.1:5555/random'
    logger = logging.getLogger('middlewares.proxy')

    async def process_request(self, request, spider):
        async with aiohttp.ClientSession() as client:
            response = await client.get(self.proxypool_url)
            if not response.status == 200:
                return
            proxy = await response.text()
            self.logger.debug(f'set proxy {proxy}')
            request.meta['proxy'] = f'http://{proxy}'

settings.py

DOWNLOADER_MIDDLEWARES = {
    "demo.middlewares.DemoDownloaderMiddleware": 543,
    "demo.middlewares.ProxyMiddleware": 544
}

隧道代理

import base64

proxyUser = "1140169503666491392"
proxyPass = "7RmCwS8r"
proxyHost = "http-short.xiaoxiangdaili.com"
proxyPort = "10010"

proxyServer = "http://%(user)s:%(pass)s@%(host)s:%(port)s" % {
    "host": proxyHost,
    "port": proxyPort,
    "user": proxyUser,
    "pass": proxyPass
}
proxyAuth = "Basic " + base64.urlsafe_b64encode(bytes((proxyUser + ":" + proxyPass), "ascii")).decode("utf8")


# 隧道代理
class ProxyMiddleware(object):
    def process_request(self, request, spider):
        request.meta["proxy"] = proxyServer
        request.headers["Connection"] = "close"
        request.headers["Proxy-Authorization"] = proxyAuth
        # 60秒一切 变为 10秒一切
        request.headers["Proxy-Switch-Ip"] = True

重试机制

settings.py

# Retry settings
RETRY_ENABLED = False
RETRY_TIMES = 5  # 想重试几次就写几
# 下面这行可要可不要
# RETRY_HTTP_CODES = [500, 502, 503, 504, 408]

重写已有重试中间件

midderwares.py

from scrapy.downloadermiddlewares.retry import RetryMiddleware

retry.py

    def _retry(self, request, reason, spider):
        max_retry_times = request.meta.get("max_retry_times", self.max_retry_times)
        priority_adjust = request.meta.get("priority_adjust", self.priority_adjust)
        # 重试更换代理IP
        proxypool_url = 'http://127.0.0.1:5555/random'
        logger = logging.getLogger('middlewares.proxy')

        async def process_request(self, request, spider):
            async with aiohttp.ClientSession() as client:
                response = await client.get(self.proxypool_url)
                if not response.status == 200:
                    return
                proxy = await response.text()
                self.logger.debug(f'set proxy {proxy}')
                request.meta['proxy'] = f'http://{proxy}'
        request.headers['Proxy-Authorization'] = "proxyauth"
        return get_retry_request(
            request,
            reason=reason,
            spider=spider,
            max_retry_times=max_retry_times,
            priority_adjust=priority_adjust,
        )

零碎知识点

scrapy两种请求方式

  1. GET请求

    import scrapy
    yield scrapy.Request(begin_url,self.first)
    
  2. POST请求

    from scrapy import FormRequest ##Scrapy中用作登录使用的一个包
    formdata = {    'username': 'wangshang',    'password': 'a706486'}
    yield scrapy.FormRequest( 
    url='http://172.16.10.119:8080/bwie/login.do',
    formdata=formdata,   
    callback=self.after_login,
    )
    

    应用场景:POST请求并且携带加密token,我们需要伪造POST请求并且解密token

scrapy个性化配置

settings.py

custom_settings_for_centoschina_cn = {
'DOWNLOADER_MIDDLEWARES' : {
   'questions.middlewares.QuestionsDownloaderMiddleware': 543,
},
'ITEM_PIPELINES': {
   'questions.pipelines.QuestionsPipeline': 300,
},
'MYSQL_URI' : '124.221.206.17',
# 'MYSQL_URI' : '43.143.155.25',
'MYSQL_DB' : 'mydb',
'MYSQL_USER':'root',
'MYSQL_PASSWORD':'123456',

}

爬虫部分

import scrapy
from questions.settings import custom_settings_for_centoschina_cn
from questions.items import QuestionsItem
from lxml import etree
class CentoschinaCnSpider(scrapy.Spider):
    name = 'centoschina.cn'
    # allowed_domains = ['centoschina.cn']
    custom_settings = custom_settings_for_centoschina_cn

3种方式加headers

  1. settings.py的默认headers

    # 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",
    }
    
  2. 每个请求加headers

    headers = {
            'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36 Edg/127.0.0.0'
        }
    
        def start_requests(self):
            start_url = "https://2024.ip138.com/"
            for n in range(5):
                # dont_filter=True, 去掉框架自带相同链接去重机制
                yield scrapy.Request(start_url, self.get_info, dont_filter=True, headers=A2024Ip138Spider.headers)
    
  3. 下载器中间件加headers

     def process_request(self, request, spider):
            # Called for each request that goes through the downloader
            # middleware.
            # 加header
            request.headers[
                'user-agent'] = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36 Edg/127.0.0.0'
            # 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
    
    

优先级:3 > 2 > 1

request携带参数, response获取参数

    def start_requests(self):
        start_url = "https://2024.ip138.com/"
        for n in range(5):
            # dont_filter=True, 去掉框架自带相同链接去重机制
            yield scrapy.Request(start_url, self.get_info, dont_filter=True, headers=A2024Ip138Spider.headers,
                                 meta={'page': 1})

    def get_info(self, response):
        # print(response.text)
        print(response.meta['page'])
        ip = response.xpath('/html/body/p[1]/a[1]/text()').extract_first()
        print(ip)

链家(scrapy项目)

项目介绍:不封IP

核心代码

import scrapy


class TjLianjiaSpider(scrapy.Spider):
    name = "tj_lianjia"

    # allowed_domains = ["ffffffffff"]
    # start_urls = ["https://ffffffffff"]
    def __init__(self):
        self.page = 1

    def start_requests(self):
        start_url = 'https://tj.lianjia.com/ershoufang/pg{}/'.format(self.page)
        yield scrapy.Request(start_url, self.get_info)

    def get_info(self, response):
        lis = response.xpath('//li[@class="clear LOGVIEWDATA LOGCLICKDATA"]')
        for li in lis:
            title = li.xpath('div[1]/div[@class="title"]/a/text()').extract_first()
            totalprice = ''.join(li.xpath('div[1]/div[@class="priceInfo"]/div[1]//text()').extract())
            print(title, totalprice)
        self.page += 1
        next_href = 'https://tj.lianjia.com/ershoufang/pg{}/'.format(self.page)
        yield scrapy.Request(next_href, self.get_info)

更多精致内容

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

【乐吾乐大屏可视化组态编辑器】状态切换

状态切换 开关状态 开关的断开和闭合。可以拖拽国家电网图库中的“开”与“关”两个组件,选中对齐重叠在一起后,右键选择“组合为状态”,在“外观”面板可以任意切换状态。 想实现点击开关图元就可以切换开关状态,可以选中图元添…

基于 springboot 2 和 vue 3 的 博客论坛系统

1. 网站信息 博客论坛系统:http://106.53.164.141:8200 本网站是 基于 SpringBootVue 前后端分离的博客论坛系统 前台用户:注册登录;博客和活动相关的展示、浏览、点赞、收藏、评论、编辑等功能 后台管理员:管理公告、博客、活…

日撸Java三百行(day25:栈实现二叉树深度遍历之中序遍历)

目录 一、栈实现二叉树遍历的可行性 二、由递归推出栈如何实现中序遍历 1.左子树入栈 2.根结点出栈 3.右子树入栈 4.实例说明 三、代码实现 总结 一、栈实现二叉树遍历的可行性 在日撸Java三百行(day16:递归)中,我们讲过…

Debian 12 基于KubeAdm搭建多节点K8S 1.28.x集群

背景 CentOS 7 官方支持和更新已于2024年6月30日结束。这意味着CentOS 7 不再接受官方的更新和补丁。并且官方推荐用户迁移到新的操作系统;而转移到Debian的优势有: 更加成熟的软件包管理系统:Debian 的包管理系统是 APT(Advanc…

cleanmymacx官网2024中文官方地址

大家好,我是你们的科技小助手。今天来跟大家聊聊一款非常神奇的产品——cleanmymacx。这是一款Mac专用的系统优化工具,最近刚刚更新了新功能哦!你们是不是经常觉得电脑越来越慢,硬盘空间不足,但又不知道该删除什么文件…

机器学习系列—深入探索弗里德曼检验:非参数统计分析的利器

🌟🌟 欢迎来到我的技术小筑,一个专为技术探索者打造的交流空间。在这里,我们不仅分享代码的智慧,还探讨技术的深度与广度。无论您是资深开发者还是技术新手,这里都有一片属于您的天空。让我们在知识的海洋中…

滴滴开源新项目Unify:聚焦Flutter与原生通信难题,助力跨端应用落地

引言 在移动开发领域,移动跨端技术因其提效收益,逐渐成为业界趋势之一。Flutter 作为近年来热门的跨端技术,以高性能、自渲染、泛跨端著称,得到广泛应用。在滴滴国际化业务中,我们大量应用 Flutter。目前已在滴滴国际化…

Sentinel集成Apollo持久化配置的技术方案

作者本人,简放视野 https://github.com/bert82503 背景 Sentinel 介绍 Sentinel 是流量治理组件,主要以流量为切入点,从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性…

拥有一个公网固定IP,既然如此简单、HTTP 虚拟专线:为您开启专属网络访问新时代

#HTTP 虚拟专线# 网络的便捷性和稳定性对于个人和企业来说至关重要。我们自豪地为您介绍一款具有创新性的产品 ——HTTP 虚拟专线,它将为您的网络体验带来前所未有的改变。 每位 VHTTP 用户都将分配一个专属的固定公网 IP 地址,这意味着您不再需要担心 I…

【视频监控】通过TCP协议搭建客户端和服务端使用OpenCV实现Linux开发板摄像头图像实时回传本地

一. 前言 本文主要实现了远程开发板摄像头画面实时传输回本地电脑进而达到视频监控功能。主要分为开发板客户端和电脑服务端的两部分代码讲解。 本文使用的是米尔的Remi Pi开发板,摄像头是米尔配套的MY-CAM003M,开发板Python环境为3.8,电脑…

Java的jdk配置成功,但是输入java -version等,命令行没有任何反应

问题 Java下载后,手动配置环境变量,并且配置好,但是在命令行中无论输入java的什么都没有反应 解决方案 将手动配置的环境变量放到最前面 重新尝试 java -version命令

C++模板的特化

目录 一、模板特化概念 二、函数模板特化 三、类模板特化 1.全特化 2.偏特化 3.总结 4.类模板特化实例应用 一、模板特化概念 函数模板和类模板都有特化: 通常情况下使用模板可以实现一些与类型无关的代码,但一些特殊类型可能会出错,…

报错:Can‘t find Python executable “python“, you can set the PYTHON env variable

将项目导入vscode,执行npm install命令后,报错了,报错的信息是node-sass安装失败,同时提示需要python环境的错误信息,这是因为安装node-sass失败了,而node-sass依赖于Python环境。 1.报错:Cant find Python…

基于Hadoop的微博社交媒体用户大数据分析【海量数据】

文章目录 有需要本项目的代码或文档以及全部资源,或者部署调试可以私信博主项目介绍数据集展示Hadoop脚本文件可视化展示每文一语 有需要本项目的代码或文档以及全部资源,或者部署调试可以私信博主 项目介绍 本项目基于hadoop的社交媒体用户进行大数据…

把照片制作成精美的仿真电子相册

​在这个数字化时代,我们拍摄的照片越来越多,但往往缺乏一个合适的方式来展示和保存这些珍贵的回忆。今天,我将向大家介绍如何将你的照片制作成一个精美的仿真电子相册,让你的回忆更加生动和持久。 第一步:选择合适的照…

FreeRTOS 3

一,信号量 有时候任务之间传递的只是一个标致,让进程之间同步,会对一个共享资源的互斥性访问,这时候就可以用信号量和互斥量。 1,二值信号量 2,计数信号量 3,互斥量 3.1,差别 4&…

Orangepi 5 Pro(香橙派5pro)部署yolov5

前言 香橙派内置了6T算力的NPU,想着可以跑一下yolov5,看看香橙派的速度如何。 在开始部署之前,需要具备一定的linux技能——vim、linux常见指令、conda等等。如果没有这些技能的话,做下去会有一定的难度,可以先看几遍了…

19.实现一个算法实现删除链表中倒数第 n 个结点

19. Remove Nth Node From End of List 题目 Given the head of a linked list, remove the nth node from the end of the list and return its head. Follow up: Could you do this in one pass? Example 1: Input: head = [1,2,3,4,5], n = 2 Output: [1,2,3,5]Example…

蚂蚁AL1 15.6T 创新科技的新典范

● 哈希率:算力达到15.6T(相当于15600G),即每秒能够进行15.6万亿次哈希计算,在同类产品中算力较为出色,能提高WA掘效率。 ● 功耗:功耗为3510W,虽然数值看似不低,但结合其…

PythonStudio 控件使用常用方式(二十七)TActionList

PythonStudio是一个极强的开发Python的IDE工具,官网地址是:https://glsite.com/ ,在官网可以下载最新版的PythonStudio,同时,在使用PythonStudio时,它也能及时为用户升到最新版本。它使用的是Delphi的控件&…