欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

ua池和代理池

程序员文章站 2022-10-19 18:28:45
下载中间件 下载中间件(Downloader Middlewares) 位于scrapy引擎和下载器之间的一层组件。 作用: (1)引擎将请求传递给下载器过程中, 下载中间件可以对请求进行一系列处理。比如设置请求的 User-Agent,设置代理等 (2)在下载器完成将Response传递给引擎中, ......

下载中间件

ua池和代理池

下载中间件(downloader middlewares) 位于scrapy引擎和下载器之间的一层组件。

作用:

(1)引擎将请求传递给下载器过程中, 下载中间件可以对请求进行一系列处理。比如设置请求的 user-agent,设置代理等

(2)在下载器完成将response传递给引擎中,下载中间件可以对响应进行一系列处理。比如进行gzip解压等。

我们主要使用下载中间件处理请求,一般会对请求设置随机的user-agent ,设置随机的代理。目的在于防止爬取网站的反爬虫策略。

ua池:user-agent池

作用:尽可能多的将scrapy工程中的请求伪装成不同类型的浏览器身份。

操作流程:

   1.在下载中间件中拦截请求

      2.将拦截到的请求的请求头信息中的ua进行篡改伪装

         3.在配置文件中开启下载中间件

代码展示:

#导包
from scrapy.contrib.downloadermiddleware.useragent import useragentmiddleware
import random
#ua池代码的编写(单独给ua池封装一个下载中间件的一个类)
class randomuseragent(useragentmiddleware):

    def process_request(self, request, spider):
        #从列表中随机抽选出一个ua值
        ua = random.choice(user_agent_list)
        #ua值进行当前拦截到请求的ua的写入操作
        request.headers.setdefault('user-agent',ua)


user_agent_list = [
        "mozilla/5.0 (windows nt 6.1; wow64) applewebkit/537.1 "
        "(khtml, like gecko) chrome/22.0.1207.1 safari/537.1",
        "mozilla/5.0 (x11; cros i686 2268.111.0) applewebkit/536.11 "
        "(khtml, like gecko) chrome/20.0.1132.57 safari/536.11",
        "mozilla/5.0 (windows nt 6.1; wow64) applewebkit/536.6 "
        "(khtml, like gecko) chrome/20.0.1092.0 safari/536.6",
        "mozilla/5.0 (windows nt 6.2) applewebkit/536.6 "
        "(khtml, like gecko) chrome/20.0.1090.0 safari/536.6",
        "mozilla/5.0 (windows nt 6.2; wow64) applewebkit/537.1 "
        "(khtml, like gecko) chrome/19.77.34.5 safari/537.1",
        "mozilla/5.0 (x11; linux x86_64) applewebkit/536.5 "
        "(khtml, like gecko) chrome/19.0.1084.9 safari/536.5",
        "mozilla/5.0 (windows nt 6.0) applewebkit/536.5 "
        "(khtml, like gecko) chrome/19.0.1084.36 safari/536.5",
        "mozilla/5.0 (windows nt 6.1; wow64) applewebkit/536.3 "
        "(khtml, like gecko) chrome/19.0.1063.0 safari/536.3",
        "mozilla/5.0 (windows nt 5.1) applewebkit/536.3 "
        "(khtml, like gecko) chrome/19.0.1063.0 safari/536.3",
        "mozilla/5.0 (macintosh; intel mac os x 10_8_0) applewebkit/536.3 "
        "(khtml, like gecko) chrome/19.0.1063.0 safari/536.3",
        "mozilla/5.0 (windows nt 6.2) applewebkit/536.3 "
        "(khtml, like gecko) chrome/19.0.1062.0 safari/536.3",
        "mozilla/5.0 (windows nt 6.1; wow64) applewebkit/536.3 "
        "(khtml, like gecko) chrome/19.0.1062.0 safari/536.3",
        "mozilla/5.0 (windows nt 6.2) applewebkit/536.3 "
        "(khtml, like gecko) chrome/19.0.1061.1 safari/536.3",
        "mozilla/5.0 (windows nt 6.1; wow64) applewebkit/536.3 "
        "(khtml, like gecko) chrome/19.0.1061.1 safari/536.3",
        "mozilla/5.0 (windows nt 6.1) applewebkit/536.3 "
        "(khtml, like gecko) chrome/19.0.1061.1 safari/536.3",
        "mozilla/5.0 (windows nt 6.2) applewebkit/536.3 "
        "(khtml, like gecko) chrome/19.0.1061.0 safari/536.3",
        "mozilla/5.0 (x11; linux x86_64) applewebkit/535.24 "
        "(khtml, like gecko) chrome/19.0.1055.1 safari/535.24",
        "mozilla/5.0 (windows nt 6.2; wow64) applewebkit/535.24 "
        "(khtml, like gecko) chrome/19.0.1055.1 safari/535.24"
]

代理池

作用:尽可能多的将scrapy工程中的请求的ip设置成不同的。

操作流程:

    1.在下载中间件中拦截请求

    2.将拦截到的请求的ip修改成某一代理ip

    3.在配置文件中开启下载中间件

代码展示:

#批量对拦截到的请求进行ip更换
#单独封装下载中间件类
class proxy(object):
    def process_request(self, request, spider):
        #对拦截到请求的url进行判断(协议头到底是http还是https)
        #request.url返回值:http://www.xxx.com
        h = request.url.split(':')[0]  #请求的协议头
        if h == 'https':
            ip = random.choice(proxy_https)
            request.meta['proxy'] = 'https://'+ip
        else:
            ip = random.choice(proxy_http)
            request.meta['proxy'] = 'http://' + ip

#可被选用的代理ip
proxy_http = [
    '153.180.102.104:80',
    '195.208.131.189:56055',
]
proxy_https = [
    '120.83.49.90:9000',
    '95.189.112.214:35508',
]