爬虫工程师的日常,就是与反爬策略斗智斗勇。别再让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,并将其设置为该请求的代理。

最低0.47元/天 解锁文章
673

被折叠的 条评论
为什么被折叠?



