文章目录
一、为什么你的爬虫总是被封?(新手必看陷阱)
搞爬虫的朋友们肯定遇到过这个抓狂时刻:代码明明写对了,结果刚运行就被网站封IP!这时候千万别急着砸键盘(虽然我也砸过…),问题的关键往往出在请求频率和身份伪装上。
1.1 真实案例翻车现场
上周我帮朋友抓取某招聘网站数据时,就遭遇了"滑铁卢":连续请求50次后直接403 Forbidden。这时候就需要祭出我们的代理IP大法了!
1.2 代理IP的核心价值
- IP轮换:突破单IP请求限制
- 地域切换:获取不同地区的定制化数据
- 匿名访问:隐藏真实服务器地址
(划重点)市面上常见代理类型:
# 免费代理(慎用!)
free_proxies = ["112.85.131.53:9999", "183.166.103.39:9999"]
# 付费代理(推荐)
paid_proxies = {
"http": "http://user:pass@58.218.92.132:23916",
"https": "https://user:pass@58.218.92.132:23916"
}
二、手把手搭建代理池(含代码实现)
2.1 代理IP获取方案对比
来源 | 稳定性 | 成本 | 适用场景 |
---|---|---|---|
免费代理站 | ★☆☆☆☆ | 0 | 短期测试 |
API服务商 | ★★★★☆ | 中 | 中小型爬虫 |
自建代理池 | ★★★★★ | 高 | 企业级数据采集 |
2.2 实战代码:智能代理中间件
import random
import requests
from fake_useragent import UserAgent
class ProxyMiddleware:
def __init__(self):
self.ua = UserAgent()
# 这里推荐使用付费代理服务(比如青果代理)
self.proxy_list = [
"http://user:pass@58.218.92.132:23916",
"http://user:pass@58.218.92.133:23916"
]
def get_proxy(self):
return random.choice(self.proxy_list)
def process_request(self, request, spider):
request.headers['User-Agent'] = self.ua.random
request.meta['proxy'] = self.get_proxy()
# 重要!设置超时时间
request.meta['download_timeout'] = 10
2.3 避坑指南(血泪经验)
- 一定要验证代理可用性(推荐定时检测脚本)
- 不同网站的反爬策略不同,要动态调整请求间隔
- 遇到验证码别硬刚,上打码平台更划算
三、电商数据抓取实战(以某平台为例)
3.1 目标分析
假设我们要抓取商品信息,需要获取:
- 商品标题
- 价格波动
- 用户评价
- 月销量数据
3.2 核心代码实现
import scrapy
from parsel import Selector
class EcommerceSpider(scrapy.Spider):
name = 'ecom_spider'
def start_requests(self):
urls = [
'https://xxx.com/category/electronics',
'https://xxx.com/category/fashion'
]
for url in urls:
yield scrapy.Request(url=url, callback=self.parse)
def parse(self, response):
sel = Selector(response)
products = sel.xpath('//div[@class="product-item"]')
for product in products:
yield {
'title': product.xpath('.//h3/text()').get().strip(),
'price': product.xpath('.//span[@class="price"]/text()').get(),
'sales': product.xpath('.//span[contains(@class,"sales")]/text()').get()
}
# 自动翻页处理
next_page = sel.xpath('//a[@class="next-page"]/@href').get()
if next_page:
yield response.follow(next_page, self.parse)
四、反反爬终极策略(2023最新版)
4.1 高级伪装技巧
- 浏览器指纹模拟(推荐使用selenium-wire)
- TLS指纹绕过
- WebSocket协议抓取
- 动态渲染页面处理(playwright神器)
4.2 请求特征混淆方案
# 请求头随机化示例
headers = {
"Accept-Encoding": random.choice(["gzip", "br", "deflate"]),
"Connection": random.choice(["keep-alive", "close"]),
"Accept-Language": random.choice(["en-US,en;q=0.9", "zh-CN,zh;q=0.8"])
}
五、数据存储与清洗(完整Pipeline)
5.1 存储方案选择
5.2 数据清洗示例
import pandas as pd
from dateutil.parser import parse
def clean_data(raw_data):
df = pd.DataFrame(raw_data)
# 价格处理
df['price'] = df['price'].str.replace('¥', '').astype(float)
# 日期标准化
df['date'] = df['date'].apply(lambda x: parse(x).strftime('%Y-%m-%d'))
# 去除重复数据
return df.drop_duplicates(subset=['title'])
六、法律红线警示(必看!!!)
根据《网络安全法》和《数据安全法》,以下行为绝对禁止:
- 抓取个人隐私数据
- 破坏网站正常运行
- 未经授权获取商业秘密
- 绕过付费内容限制
(重要提示)合法爬虫三原则:
- 遵守robots.txt协议
- 控制请求频率
- 仅采集公开数据
七、常见问题Q&A
Q:免费代理能用吗?
A:短期测试可以,长期使用建议购买商业代理(免费代理存活率不到10%!)
Q:遇到验证码怎么办?
A:推荐使用第三方打码平台(如超级鹰),准确率高达98%
Q:数据抓取速度慢?
A:试试异步请求库(aiohttp)配合代理池,速度提升10倍不是梦!
八、拓展资源推荐
想要成为爬虫高手?这些工具助你一臂之力:
- 抓包工具:Charles/Fiddler
- 逆向工具:Chrome DevTools
- 验证码识别:ddddocr
- 自动化神器:Playwright
(私藏技巧)遇到动态加载数据怎么办?试试这个万能代码:
from selenium.webdriver import ChromeOptions
options = ChromeOptions()
options.add_argument("--headless") # 无头模式
options.add_argument("--disable-blink-features=AutomationControlled")
driver = webdriver.Chrome(options=options)
driver.get(url)
html = driver.page_source
最后提醒大家:技术是把双刃剑,一定要在法律允许的范围内使用爬虫技术!如果觉得本文有帮助,欢迎分享给更多需要的小伙伴~(转载请标明出处)