本文介绍如何在Scrapy中使用无忧代理(www.data5u.com)的爬虫动态代理IP,以及如何设置User-Agent.
动态转发参考https://blog.csdn.net/u010978757/article/details/104521024
一、创建Scrapy工程
scrapy startproject 工程名
二、进入工程目录,根据爬虫模板生成爬虫文件
scrapy genspider -l # 查看可用模板
scrapy genspider -t 模板名 爬虫文件名 允许的域名
三、定义爬取关注的数据(items.py文件)
四、编写爬虫文件
五、设置IP池或用户代理
- 在settings.py同级目录下新建一个文件data5u.py(第8步会用到),添加如下代码:
IPPOOL = [ ]
- 创建下载中间文件middlewares.py(与settings.py同一个目录),代码如下:
# -*- coding: UTF-8 -*-
'''
Python 3.x
无忧代理IP Created on 2018年07月11日
描述:本段代码是Scrapy的代理中间件,用于设置代理IP
@author: www.data5u.com
'''
# 导入随机模块
import random
# 导入data5u文件中的IPPOOL
from data5u import IPPOOL
# 导入官方文档对应的HttpProxyMiddleware
from scrapy.contrib.downloadermiddleware.httpproxy import HttpProxyMiddleware
class IPPOOlS(HttpProxyMiddleware):
# 初始化
def __init__(self, ip=''):
self.ip = ip
# 请求处理
def process_request(self, request, spider):
# 先随机选择一个IP
thisip = random.choice(IPPOOL)
print("当前使用IP是:"+ thisip)
request.meta["proxy"] = "http://"+thisip
- 在settings.py中配置下载中间件,代码如下:
# 配置下载中间件的连接信息
DOWNLOADER_MIDDLEWARES = {
'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware':123,
'modetest.middlewares.IPPOOlS' : 125
}
- 在settings.py文件中添加用户UserAgent的信息,如:
# 设置用户代理池
UAPOOL= [
"Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36 Edge/14.14393"
]
- 创建下载中间文件uamid.py(与settings.py同一个目录),代码为:
# -*- coding: UTF-8 -*-
'''
Python 3.x
无忧代理IP Created on 2018年07月11日
描述:本段代码是Scrapy的下载中间件,用于模拟UserAgent
@author: www.data5u.com
'''
# 导入随机模块
import random
# 导入settings文件中的UAPOOL
from settings import UAPOOL
# 导入官方文档对应的HttpProxyMiddleware
from scrapy.contrib.downloadermiddleware.useragent import UserAgentMiddleware
class Uamid(UserAgentMiddleware):
# 初始化 注意一定要user_agent,不然容易报错
def __init__(self, user_agent=''):
self.user_agent = user_agent
# 请求处理
def process_request(self, request, spider):
# 先随机选择一个用户代理
thisua = random.choice(UAPOOL)
print("当前使用User-Agent是:"+thisua)
request.headers.setdefault('User-Agent',thisua)
- 在settings.py中配置下载中间件(合并了第三步的代码):
# 配置下载中间件的连接信息
DOWNLOADER_MIDDLEWARES = {
'scrapy.contrib.downloadermiddleware.useragent.UserAgentMiddleware': 2,
'modetest.uamid.Uamid': 1
}
- 整体的settings.py代码如下:
# -*- coding: UTF-8 -*-
'''
Python 3.x
无忧代理IP Created on 2018年07月11日
描述:本段代码是Scrapy的配置信息
@author: www.data5u.com
'''
#========================================
# 设置IP池和用户UserAgent
# 禁止本地Cookie
COOKIES_ENABLED = False
# 设置用户代理池
UAPOOL = [
"Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36 Edge/14.14393"
]
# 配置下载中间件的连接信息
DOWNLOADER_MIDDLEWARES = {
'scrapy.contrib.downloadermiddlewares.httpproxy.HttpProxyMiddleware':123,
'modetest.middlewares.IPPOOlS' : 125,
'scrapy.contrib.downloadermiddleware.useragent.UserAgentMiddleware': 2,
'modetest.uamid.Uamid': 1
}
#============================================
- 定义一个线程,定时从无忧代理API接口中获取IP,存入data5u.py中的IPPOOL变量中,代码如下:
# -*- coding: UTF-8 -*-
'''
Python 3.x
无忧代理IP Created on 2018年07月11日
描述:本段代码定时从无忧代理API接口获取代理IP,存入IP池中
@author: www.data5u.com
'''
import requests;
import time;
import threading;
from data5u import IPPOOL;
from requests.packages import urllib3;
# 获取代理IP的线程类
class GetIpThread(threading.Thread):
def __init__(self,apiUrl, fetchSecond):
super(GetIpThread, self).__init__();
self.fetchSecond=fetchSecond;
self.apiUrl=apiUrl;
def run(self):
while True:
# 获取IP列表
res = requests.get(self.apiUrl).content.decode()
# 按照\n分割获取到的IP
IPPOOL = res.split('\n');
# 休眠
time.sleep(self.fetchSecond);
- 在您爬虫的启动类(if name == ‘main’:)里面添加如下代码定时获取代理IP:
# 这里填写无忧代理IP提供的API订单号(请到用户中心获取)
order = "请把这里替换为您的IP提取码";
# 获取IP的API接口
apiUrl = "http://api.ip.data5u.com/dynamic/get.html?order=" + order;
# 获取IP时间间隔,建议为5秒
fetchSecond = 5;
# 开始自动获取IP
GetIpThread(apiUrl, fetchSecond).start();
参考链接:http://www.data5u.com/help/article-61.html