一、定义实现随机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 != '':
  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. def getCookies():
  5. # 使用selenium模拟登陆,获取并返回cookie
  6. username = input('输入github账号:')
  7. password = input('输入github密码:')
  8. options = webdriver.ChromeOptions()
  9. options.add_argument('--headless')
  10. options.add_argument('--disable-gpu')
  11. driver = webdriver.Chrome('/home/worker/Desktop/driver/chromedriver',
  12. chrome_options=options)
  13. driver.get('https://github.com/login')
  14. time.sleep(1)
  15. driver.find_element_by_xpath('//*[@id="login_field"]').send_keys(username)
  16. time.sleep(1)
  17. driver.find_element_by_xpath('//*[@id="password"]').send_keys(password)
  18. time.sleep(1)
  19. driver.find_element_by_xpath('//*[@id="login"]/form/div[3]/input[3]').click()
  20. time.sleep(2)
  21. cookies_dict = {cookie['name']: cookie['value'] for cookie in driver.get_cookies()}
  22. driver.quit()
  23. return cookies_dict
  24.  
  25. class LoginDownloaderMiddleware(object):
  26.  
  27. def process_request(self, request, spider):
  28. cookies_dict = getCookies()
  29. print(cookies_dict)
  30. 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

Scrapy中间件user-agent和ip代理使用的更多相关文章

  1. scrapy实战9动态设置ip代理从数据库中随机获取一个可用的ip:

    在目录下创建tools(python package) 在tools中创建crawl_xici_ip.py文件写入代码如下: #coding=utf-8 import requests from sc ...

  2. Scrapy加Redis加IP代理池实现音乐爬虫

    音乐爬虫 关注公众号"轻松学编程"了解更多. 目的:爬取歌名,歌手,歌词,歌曲url. 一.创建爬虫项目 创建一个文件夹,进入文件夹,打开cmd窗口,输入: scrapy star ...

  3. 写一个scrapy中间件--ip代理池

    middleware文件 # -*- coding: utf-8 -*- # Define here the models for your spider middleware # See docum ...

  4. 下载中间件--随机IP代理以及随机User_Agent

    下载中间件随机IP代理以及随机User_Agent 1.在settings.py中设置开启代理功能 # 设置下载中间件 DOWNLOADER_MIDDLEWARES = { # 随机的 User-Ag ...

  5. Scrapy学习篇(十二)之设置随机IP代理(IPProxy)

    当我们需要大量的爬取网站信息时,除了切换User-Agent之外,另外一个重要的方式就是设置IP代理,以防止我们的爬虫被拒绝,下面我们就来演示scrapy如何设置随机IPProxy. 设置随机IPPr ...

  6. scrapy中使用 IP 代理

    在 scrapy 中使用 ip 代理需要借助中间件的功能 首先在settings 中设置好中间件,中间件优先级数字越小越先被执行 , } 然后编写中间件,拦截请求设置代理 class ProxyMid ...

  7. python爬虫实战(三)--------搜狗微信文章(IP代理池和用户代理池设定----scrapy)

    在学习scrapy爬虫框架中,肯定会涉及到IP代理池和User-Agent池的设定,规避网站的反爬. 这两天在看一个关于搜狗微信文章爬取的视频,里面有讲到ip代理池和用户代理池,在此结合自身的所了解的 ...

  8. Scrapy学习-13-使用DownloaderMiddleware设置IP代理池及IP变换

    设置IP代理池及IP变换方案 方案一: 使用国内免费的IP代理 http://www.xicidaili.com # 创建一个tools文件夹,新建一个py文件,用于获取代理IP和PORT from ...

  9. scrapy中间件中使用selenium切换ip

    scrapy抓取一些需要js加载页面时一般要么是通过接口直接获取数据,要么是js加载,但是我通过selenium也可以获取动态页面 但是有个问题,容易给反爬,因为在scrapy中间件mid中使用sel ...

  10. scrapy中间件之下载中间件使用(网易新闻爬取)

    scrapy项目中的middlewarse.py中间件 爬虫中间件:目前先不介绍 下载中间件(需要在settings.py中开启) (1)请求处理函数:process_request(self, re ...

随机推荐

  1. 记一次VM虚拟机Ubuntu无法联网问题

    突然ubuntu获取不到ipv4地址,手动设置静态ip也ping不通本机, 在网上试了一堆的方法也不行,就怀疑是vm设置问题了.因为 作业环境我的VM需要经常性的改变桥接的网卡,所以检查了一 下这里, ...

  2. python-request-各方法使用及格式

    Request库方法介绍 方法 说明 requests.request() 构造一个请求,支撑一下各方法的基础方法  requests.get()  获取HTML网页的主要方法,对应于HTTP的GET ...

  3. HashMap循环过程中删除元素发生ConcurrentModificationException的源码分析

  4. CentOS7服务管理

    1.在/usr/lib/systemd/system目录下建立服务启动文件,文件格式:[root@Centos7 ]# cat /usr/lib/systemd/system/nginx.servic ...

  5. Lua 用指定字符或字符串分割输入字符串,返回包含分割结果的数组

    // 用指定字符或字符串分割输入字符串,返回包含分割结果的数组 // @function [parent=#string] split // @param string input 输入字符串 // ...

  6. loglog 函数的使用

    验证数值算法的正确性,有一个很重要的指标就是收敛阶($\tt\bf Convergent~Rate$) 当有误差估计: $$Error=\lVert u(x)-u_N(x) \rVert \simeq ...

  7. <!--#include virtual='head.html'-->代码复用

    js限制input框只能输入数字:<input type="text" onkeyup="value=value.replace(/[^\d]/g,'')" ...

  8. 解决[Errno 10048]报错

    最近一直很纳闷,写的python程序在自己电脑上运行得非常顺利,放到远程测试机上经常报“[Errno 10048]通常每个套接字地址(协议/网络地址/端口)“这样的错误,百度到这种是端口号冲突引起的, ...

  9. 使用 requests 模块

    官网:http://docs.python-requests.org/en/master/ 请求方式 requests.get() requests.post() requests.put() req ...

  10. Vue2.0增删改查案例(Vue+Less+LocalStorage)

    本人写的小程序,功能还在完善中,欢迎扫一扫提出宝贵意见!           Vue+Less+LocalStorage 安装Less:npm install less less-loader --s ...