一、定义实现随机User-Agent的下载中间件

1.在middlewares.py中完善代码

 import random
from Tencent.settings import USER_AGENTS_LIST # 注意导入路径,请忽视pycharm的错误提示 class UserAgentMiddleware(object):
def process_request(self, request, spider):
user_agent = random.choice(USER_AGENTS_LIST)
request.headers['User-Agent'] = user_agent
# 不写return class CheckUA:
def process_response(self,request,response,spider):
print(request.headers['User-Agent'])
return response # 不能少!

2.在settings中设置开启自定义的下载中间件,设置方法同管道

 DOWNLOADER_MIDDLEWARES = {
'Tencent.middlewares.UserAgentMiddleware': 543, # 543是权重值
'Tencent.middlewares.CheckUA': 600, # 先执行543权重的中间件,再执行600的中间件
}

3.在settings中添加UA的列表

 USER_AGENTS_LIST = [
"Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN) AppleWebKit/523.15 (KHTML, like Gecko, Safari/419.3) Arora/0.3 (Change: 287 c9dfb30)",
"Mozilla/5.0 (X11; U; Linux; en-US) AppleWebKit/527+ (KHTML, like Gecko, Safari/419.3) Arora/0.6",
"Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.2pre) Gecko/20070215 K-Ninja/2.1.1",
"Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9) Gecko/20080705 Firefox/3.0 Kapiko/3.0",
"Mozilla/5.0 (X11; Linux i686; U;) Gecko/20070322 Kazehakase/0.4.5"
]

二、代理ip的使用

1.在middlewares.py中完善代码

 class RandomProxy(object):

     def process_request(self, request, spider):

         proxy = random.choice(PROXY_LIST)
print(proxy) if 'user_passwd' in proxy:
# 对账号密码进行编码,基础认证,python3中需要是bytes类型的数据才能编码
b64_up = base64.b64encode(proxy['user_passwd'].encode()) # 进行代理认证
request.headers['Proxy-Authorization'] = 'Basic ' + b64_up.decode() # 设置代理
request.meta['proxy'] = proxy['ip_port']
else:
#设置代理
request.meta['proxy'] = proxy['ip_port']

2.检测代理ip是否可用

在使用了代理ip的情况下可以在下载中间件的process_response()方法中处理代理ip的使用情况,如果该代理ip不能使用可以替换其他代理ip

 class ProxyMiddleware(object):
......
def process_response(self, request, response, spider):
if response.status != '':
request.dont_filter = True # 重新发送的请求对象能够再次进入队列
return requst

3.在settings中添加代理ip的列表

 PROXY_LIST = [
{"ip_port": "139.199.121.163:16818", "user_passwd": "user:password"},#收费代理
# {"ip_port": "114.234.81.72:9000"} # 免费代理
]

三. 在中间件中使用selenium

以github登陆为例

1. 完成爬虫代码

 import scrapy

 class Login4Spider(scrapy.Spider):
name = 'login4'
allowed_domains = ['github.com']
start_urls = ['https://github.com/returnes'] # 直接对验证的url发送请求 def parse(self, response):
with open('check.html', 'w') as f:
f.write(response.body.decode())

2.在middlewares.py中使用selenium获取cookie信息

 import time
from selenium import webdriver def getCookies():
# 使用selenium模拟登陆,获取并返回cookie
username = input('输入github账号:')
password = input('输入github密码:')
options = webdriver.ChromeOptions()
options.add_argument('--headless')
options.add_argument('--disable-gpu')
driver = webdriver.Chrome('/home/worker/Desktop/driver/chromedriver',
chrome_options=options)
driver.get('https://github.com/login')
time.sleep(1)
driver.find_element_by_xpath('//*[@id="login_field"]').send_keys(username)
time.sleep(1)
driver.find_element_by_xpath('//*[@id="password"]').send_keys(password)
time.sleep(1)
driver.find_element_by_xpath('//*[@id="login"]/form/div[3]/input[3]').click()
time.sleep(2)
cookies_dict = {cookie['name']: cookie['value'] for cookie in driver.get_cookies()}
driver.quit()
return cookies_dict class LoginDownloaderMiddleware(object): def process_request(self, request, spider):
cookies_dict = getCookies()
print(cookies_dict)
request.cookies = cookies_dict # 对请求对象的cookies属性进行替换

3.在middlewares.py中使用selenium获取指定页面渲染后的html源码

 class SelMiddleWare(object):

     def process_request(self, request, spider):

         url = request.url
# 过滤需要渲染的请求对象
if 'daydata' in url: driver = webdriver.Chrome() driver.get(url)
time.sleep(3) data = driver.page_source
driver.close() res = HtmlResponse(
url=url,
body=data,
encoding='utf-8',
request=request
) return res

最新文章

  1. .NET 常用框架
  2. 手机端布局rem 与vm的使用
  3. Laravel学习笔记(一)安装配置开发环境
  4. 通过ssh连接github
  5. 解决asp.net Core Mvc网页汉字乱码问题
  6. dubbo 转
  7. No.1__C#
  8. CentOS目录结构超详细版
  9. UML类图详细介绍
  10. 最简单的基于FFMPEG+SDL的视频播放器 ver2 (採用SDL2.0)
  11. crm采用soap删除记录
  12. HTML link标签media参数
  13. 解决WordPress邮件无法发送问题
  14. Akka(37): Http:客户端操作模式
  15. ES6常用语法
  16. 允许浏览器下载exe.config文件
  17. 码云和git
  18. Java_Properties
  19. 【教你玩转云计算】在阿里云一键安装快速部署Oracle11g
  20. ubuntu——caffe配置deeplab

热门文章

  1. PowerShell自定义函数定义及调用
  2. Java将string内容写入到TXT文件
  3. put与putIfAbsent区别
  4. 创建X个任意元素数组并且可以遍历的的一个方法
  5. 雷林鹏分享:jQuery EasyUI 数据网格 - 设置冻结列
  6. Springboot项目启动后访问不到Controller
  7. mysql 表关联批量更新
  8. 一条shell命令让多台Linux服务器执行
  9. QT-简易视频播放器
  10. [LeetCode] 26. Remove Duplicates from Sorted Array ☆(从有序数组中删除重复项)