Scrapy中间件user

Stella981
• 阅读 697

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

1.在middlewares.py中完善代码

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

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

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

3.在settings中添加UA的列表

1 USER_AGENTS_LIST = [
2     "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)",
3     "Mozilla/5.0 (X11; U; Linux; en-US) AppleWebKit/527+ (KHTML, like Gecko, Safari/419.3) Arora/0.6",
4     "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.2pre) Gecko/20070215 K-Ninja/2.1.1",
5     "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9) Gecko/20080705 Firefox/3.0 Kapiko/3.0",
6     "Mozilla/5.0 (X11; Linux i686; U;) Gecko/20070322 Kazehakase/0.4.5"
7 ]

二、代理ip的使用

1.在middlewares.py中完善代码

 1 class RandomProxy(object):
 2 
 3     def process_request(self, request, spider):
 4 
 5         proxy = random.choice(PROXY_LIST)
 6         print(proxy)
 7 
 8         if 'user_passwd' in proxy:
 9             # 对账号密码进行编码,基础认证,python3中需要是bytes类型的数据才能编码
10             b64_up = base64.b64encode(proxy['user_passwd'].encode())
11 
12             # 进行代理认证
13             request.headers['Proxy-Authorization'] = 'Basic ' + b64_up.decode()
14 
15             # 设置代理
16             request.meta['proxy'] = proxy['ip_port']
17         else:
18             #设置代理
19             request.meta['proxy'] = proxy['ip_port']

2.检测代理ip是否可用

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

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

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

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

三. 在中间件中使用selenium

以github登陆为例

1. 完成爬虫代码

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

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

 1 import time
 2 from selenium import webdriver
 3 
 4 
 5 def getCookies():
 6     # 使用selenium模拟登陆,获取并返回cookie
 7     username = input('输入github账号:')
 8     password = input('输入github密码:')
 9     options = webdriver.ChromeOptions()
10     options.add_argument('--headless')
11     options.add_argument('--disable-gpu')
12     driver = webdriver.Chrome('/home/worker/Desktop/driver/chromedriver',
13                               chrome_options=options)
14     driver.get('https://github.com/login')
15     time.sleep(1)
16     driver.find_element_by_xpath('//*[@id="login_field"]').send_keys(username)
17     time.sleep(1)
18     driver.find_element_by_xpath('//*[@id="password"]').send_keys(password)
19     time.sleep(1)
20     driver.find_element_by_xpath('//*[@id="login"]/form/div[3]/input[3]').click()
21     time.sleep(2)
22     cookies_dict = {cookie['name']: cookie['value'] for cookie in driver.get_cookies()}
23     driver.quit()
24     return cookies_dict
25 
26 class LoginDownloaderMiddleware(object):
27 
28     def process_request(self, request, spider):
29         cookies_dict = getCookies()
30         print(cookies_dict)
31         request.cookies = cookies_dict # 对请求对象的cookies属性进行替换

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

 1 class SelMiddleWare(object):
 2 
 3     def process_request(self, request, spider):
 4 
 5         url = request.url
 6         # 过滤需要渲染的请求对象
 7         if 'daydata' in url:
 8 
 9             driver = webdriver.Chrome()
10 
11             driver.get(url)
12             time.sleep(3)
13 
14             data = driver.page_source
15             driver.close()
16 
17             res = HtmlResponse(
18                 url=url,
19                 body=data,
20                 encoding='utf-8',
21                 request=request
22             )
23 
24             return res
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
java将前端的json数组字符串转换为列表
记录下在前端通过ajax提交了一个json数组的字符串,在后端如何转换为列表。前端数据转化与请求varcontracts{id:'1',name:'yanggb合同1'},{id:'2',name:'yanggb合同2'},{id:'3',name:'yang
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
3个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
9个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这