Python爬虫基础教程(30)Python Scrapy爬虫实战:获取代理之创建编辑Scrapy爬虫:Scrapy爬虫逆袭指南:动态代理IP让你摆脱封杀噩梦

爬虫工程师的日常,就是与反爬策略斗智斗勇。别再让IP封禁成为你的噩梦,学会动态代理IP,让数据采集畅通无阻。

一、爬虫的噩梦:IP被封的那些事儿

相信每个写爬虫的朋友都经历过这样的场景:精心编写的Scrapy爬虫刚开始运行得挺顺利,结果没过几分钟,速度就慢下来,然后完全停止——IP又被网站封了。

这就像打电话推销,一直用同一个号码,人家一看就挂断,最后直接拉黑。爬虫也是一个道理,网站检测到来自同一IP的异常访问,就会毫不留情地封禁。

那么,如何解决这个问题呢? 答案就是:动态代理IP。通过不断更换IP地址,让网站以为每次请求都是来自不同的用户,从而避免被反爬系统检测到。今天,我们就来详细讲解如何在Scrapy中配置动态代理IP,并附上完整的实战示例。

二、Scrapy快速入门:创建你的第一个爬虫

在开始配置动态代理之前,我们先来快速创建一个简单的Scrapy爬虫。如果你已经熟悉Scrapy的基础使用,可以跳过这一节。

2.1 创建Scrapy项目

打开命令行,进入你想要存储代码的目录,运行以下命令:

scrapy startproject tencent

这个命令会创建一个名为"tencent"的文件夹,里面包含了一个Scrapy项目的基本结构:

tencent/
├── scrapy.cfg           # 项目的配置文件
└── tencent/             # 该项目的Python模块
    ├── __init__.py
    ├── items.py         # 项目中的item文件,定义数据结构
    ├── middlewares.py   # 中间件文件,代理就在这里配置
    ├── pipelines.py     # 项目中的pipelines文件,处理爬取的数据
    ├── settings.py      # 项目的设置文件
    └── spiders/         # 放置spider代码的目录
        └── __init__.py

2.2 定义要爬取的数据结构

items.py文件中,我们定义需要爬取的字段:

import scrapy

class TencentItem(scrapy.Item):
    # 职位名
    positionname = scrapy.Field()
    # 详情连接
    positionlink = scrapy.Field()
    # 职位类别
    positionType = scrapy.Field()
    # 招聘人数
    peopleNum = scrapy.Field()
    # 工作地点
    workLocation = scrapy.Field()
    # 发布时间
    publishTime = scrapy.Field()

2.3 编写爬虫代码

进入项目目录,使用命令创建一个基础爬虫类:

cd tencent
scrapy genspider tencentPosition "tencent.com"

执行命令后会在spiders文件夹中创建一个tencentPosition.py的文件,现在开始编写爬虫逻辑:

# -*- coding: utf-8 -*-
import scrapy
from tencent.items import TencentItem

class TencentpositionSpider(scrapy.Spider):
    # 爬虫名
    name = "tencentPosition"
    # 爬虫作用范围
    allowed_domains = ["tencent.com"]
    url = "http://hr.tencent.com/position.php?&start="
    offset = 0
    # 起始url
    start_urls = [url + str(offset)]
    
    def parse(self, response):
        # 解析每一行数据
        for each in response.xpath("//tr[@class='even'] | //tr[@class='odd']"):
            # 初始化模型对象
            item = TencentItem()
            # 职位名称
            item['positionname'] = each.xpath("./td[1]/a/text()").extract()[0]
            # 详情连接
            item['positionlink'] = each.xpath("./td[1]/a/@href").extract()[0]
            # 职位类别
            item['positionType'] = each.xpath("./td[2]/text()").extract()[0]
            # 招聘人数
            item['peopleNum'] = each.xpath("./td[3]/text()").extract()[0]
            # 工作地点
            item['workLocation'] = each.xpath("./td[4]/text()").extract()[0]
            # 发布时间
            item['publishTime'] = each.xpath("./td[5]/text()").extract()[0]
            
            yield item
        
        # 分页处理
        if self.offset < 1680:
            self.offset += 10
            # 每次处理完一页的数据之后,重新发送下一页页面请求
            yield scrapy.Request(self.url + str(self.offset), callback=self.parse)

2.4 运行爬虫

在项目目录下执行以下命令运行爬虫:

scrapy crawl tencentPosition

这样一个基础的Scrapy爬虫就完成了。但问题是,这样的爬虫很容易被网站检测并封禁IP。接下来,我们就来看看如何通过动态代理IP解决这个问题。

三、四步搞定Scrapy动态代理IP配置

配置Scrapy动态代理IP并不复杂,只需要四步就能搞定。

3.1 第一步:创建代理中间件

中间件是Scrapy处理请求和响应的组件,我们可以在请求发出前为其设置代理。在middlewares.py这个文件里,定义一个DynamicProxyMiddleware类。

import random
from .settings import PROXY_LIST

class DynamicProxyMiddleware(object):
    def __init__(self):
        # 初始化代理IP列表
        self.proxies = PROXY_LIST
    
    def process_request(self, request, spider):
        # 随机选个代理IP
        proxy = random.choice(self.proxies)
        print('当前使用代理IP:', proxy)
        # 将其注入到请求里
        request.meta['proxy'] = proxy

这个中间件的工作原理是:在每个请求发出前,随机从代理IP池中选择一个IP,并将其设置为该请求的代理。

3.2 第二步:在s

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

值引力

持续创作,多谢支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值