当前位置: 首页 > news >正文

白云手机网站建设价格百度推广管家

白云手机网站建设价格,百度推广管家,设计公司上市企业,自己可以免费做网站吗爬虫scrapy中间件的使用 学习目标: 应用 scrapy中使用间件使用随机UA的方法应用 scrapy中使用代理ip的的方法应用 scrapy与selenium配合使用 1. scrapy中间件的分类和作用 1.1 scrapy中间件的分类 根据scrapy运行流程中所在位置不同分为: 下载中间件…

爬虫scrapy中间件的使用

学习目标:
  1. 应用 scrapy中使用间件使用随机UA的方法
  2. 应用 scrapy中使用代理ip的的方法
  3. 应用 scrapy与selenium配合使用

1. scrapy中间件的分类和作用

1.1 scrapy中间件的分类

根据scrapy运行流程中所在位置不同分为:

  1. 下载中间件
  2. 爬虫中间件
1.2 scrapy中间的作用:预处理request和response对象
  1. 对header以及cookie进行更换和处理
  2. 使用代理ip等
  3. 对请求进行定制化操作,

但在scrapy默认的情况下 两种中间件都在middlewares.py一个文件中

爬虫中间件使用方法和下载中间件相同,且功能重复,通常使用下载中间件

2. 下载中间件的使用方法:

接下来我们对腾讯招聘爬虫进行修改完善,通过下载中间件来学习如何使用中间件
编写一个Downloader Middlewares和我们编写一个pipeline一样,定义一个类,然后在setting中开启

Downloader Middlewares默认的方法:

  • process_request(self, request, spider):
    1. 当每个request通过下载中间件时,该方法被调用。
      2. 返回None值:没有return也是返回None,该request对象传递给下载器,或通过引擎传递给其他权重低的process_request方法
      3. 返回Response对象:不再请求,把response返回给引擎
      4. 返回Request对象:把request对象通过引擎交给调度器,此时将不通过其他权重低的process_request方法
  • process_response(self, request, response, spider):
    1. 当下载器完成http请求,传递响应给引擎的时候调用
      2. 返回Resposne:通过引擎交给爬虫处理或交给权重更低的其他下载中间件的process_response方法
      3. 返回Request对象:通过引擎交给调取器继续请求,此时将不通过其他权重低的process_request方法
  • 在settings.py中配置开启中间件,权重值越小越优先执行

3. 定义实现随机User-Agent的下载中间件

3.1 在middlewares.py中完善代码 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 # 不能少!
3.2 在settings中设置开启自定义的下载中间件,设置方法同管道
DOWNLOADER_MIDDLEWARES = {'Tencent.middlewares.UserAgentMiddleware': 543, # 543是权重值'Tencent.middlewares.CheckUA': 600, # 先执行543权重的中间件,再执行600的中间件
}
3.3 在settings中添加UA的列表
USER_AGENTS_LIST = ["Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0)","Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 1.0.3705; .NET CLR 1.1.4322)","Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.2; .NET CLR 3.0.04506.30)","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"
]
运行爬虫观察现象

4. 代理ip的使用

4.1 思路分析
  1. 代理添加的位置:request.meta中增加proxy字段
  2. 获取一个代理ip,赋值给request.meta['proxy']
    • 代理池中随机选择代理ip
    • 代理ip的webapi发送请求获取一个代理ip
4.2 具体实现

免费代理ip:

class ProxyMiddleware(object):def process_request(self,request,spider):# proxies可以在settings.py中,也可以来源于代理ip的webapi# proxy = random.choice(proxies) # 免费的会失效,报 111 connection refused 信息!重找一个代理ip再试proxy = 'https://1.71.188.37:3128' request.meta['proxy'] = proxyreturn None # 可以不写return

收费代理ip:

# 人民币玩家的代码(使用abuyun提供的代理ip)
import base64# 代理隧道验证信息  这个是在那个网站上申请的
proxyServer = 'http://proxy.abuyun.com:9010' # 收费的代理ip服务器地址,这里是abuyun
proxyUser = 用户名
proxyPass = 密码
proxyAuth = "Basic " + base64.b64encode(proxyUser + ":" + proxyPass)class ProxyMiddleware(object):def process_request(self, request, spider):# 设置代理request.meta["proxy"] = proxyServer# 设置认证request.headers["Proxy-Authorization"] = proxyAuth
4.3 检测代理ip是否可用

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

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

5. 在中间件中使用selenium

5.1 在爬虫文件中配置好浏览器信
#设置一个无头无可视化界面的浏览器
chrome_options = Options()
# 无可视化界面
chrome_options.add_argument("--headless")
chrome_options.add_argument("--di sable-gpu")  
# 规避监测
chrome_options.add_experimental_option('excludeSwitches', ['enable-automation'])
self.browse = webdriver.Chrome(options=chrome_options)
5.2 在middlewares.py中使用selenium
# 开始拦截篡改下载中间件
class NewsSpiderDownloaderMiddleware:# Not all methods need to be defined. If a method is not defined,# scrapy acts as if the downloader middleware does not modify the# passed objects.@classmethoddef from_crawler(cls, crawler):# This method is used by Scrapy to create your spiders.s = cls()crawler.signals.connect(s.spider_opened, signal=signals.spider_opened)return sdef process_request(self, request, spider):# Called for each request that goes through the downloader# middleware.# Must either:# - return None: continue processing this request# - or return a Response object# - or return a Request object# - or raise IgnoreRequest: process_exception() methods of#   installed downloader middleware will be calledreturn None# 该方法拦截四大板块对应的响应对象 且篡改# 注意settings文件中一定要启动对应权限def process_response(self, request, response, spider):# 对需要篡改部分做判断 否则会影响其他请求对应的repsonseif request.url in spider.module_urls:  # 获取从爬虫程序中创建出的浏览器对象browse = spider.browse# 通过selenium向四大板块的url发起请求,获取到动态加载的数据browse.get(request.url)# 下拉翻页browse.execute_script('window.scrollTo(0,document.body.scrollHeight)')time.sleep(1.5)# 获取源码page_text = browse.page_source#针对定位到的response进行篡改# 这里的篡改指实例化一个新的响应对象(符合需求:包含动态加载的数据),替换(HtmlResponse)原来的响应对象# 参数解释:url:响应对应的url body:响应体  requests:scrapy中的请求对象,数据都是跟着请求对象走的new_response = HtmlResponse(url=request.url, body=page_text, encoding='utf-8', request=request)return new_response  # 篡改响应对象 不再经过download,直接将新的响应体返回给引擎# 此时就可以回到爬虫文件继续往下写  判断如果是selenium请求过来的我们才返回处理后的new_responseelse:# 其他请求对应的响应对象return response # return responsedef process_exception(self, request, exception, spider):# Called when a download handler or a process_request()# (from other downloader middleware) raises an exception.# Must either:# - return None: continue processing this exception# - return a Response object: stops process_exception() chain# - return a Request object: stops process_exception() chainpassdef spider_opened(self, spider):spider.logger.info('Spider opened: %s' % spider.name)
配置文件中设置开启该中间件后,运行爬虫可以在日志信息中看到selenium相关内容

小结

中间件的使用:

  1. 完善中间件代码:
  • process_request(self, request, spider):
    1. 当每个request通过下载中间件时,该方法被调用。
    2. 返回None值:没有return也是返回None,该request对象传递给下载器,或通过引擎传递给其他权重低的process_request方法
    3. 返回Response对象:不再请求,把response返回给引擎
    4. 返回Request对象:把request对象通过引擎交给调度器,此时将不通过其他权重低的process_request方法
  • process_response(self, request, response, spider):
    1. 当下载器完成http请求,传递响应给引擎的时候调用
    2. 返回Resposne:通过引擎交给爬虫处理或交给权重更低的其他下载中间件的process_response方法
    3. 返回Request对象:通过引擎交给调取器继续请求,此时将不通过其他权重低的process_request方法
  1. 需要在settings.py中开启中间件
    DOWNLOADER_MIDDLEWARES = {
    ‘myspider.middlewares.UserAgentMiddleware’: 543,
    }
http://www.wooajung.com/news/27880.html

相关文章:

  • 做木工的网站开网店如何运营和推广
  • 上饶做网站建设东莞做好网络推广
  • 织梦能不能做门户网站长沙优化排名推广
  • 石家庄企业制作网站广告传媒公司
  • 自己网站上做淘宝搜索西安网站建设公司排行榜
  • 代备案网站空间百度网页版官网
  • 阿里云做的网站为啥没有ftp如何免费创建自己的平台
  • 免费的网址域名百度优化排名软件
  • 怎么做扒代码网站外链推广是什么意思
  • 注册网站获取网易邮箱安全码5g站长工具查询
  • 做网站用的代码手机百度网址大全首页
  • 顺德医疗网站建设郑州百度快照优化排名
  • 有关做内购的网站站长工具 seo查询
  • 北京网站seo外包现在推广一般都用什么软件
  • mip织梦手机网站模板关键词排名优化系统
  • 北京建网站百度经验首页官网
  • 建e网站官网案例2023b站免费推广入口
  • 税务局网站公司实名制怎么做个人推广平台
  • 生鲜网站建设规划书范文创网站永久免费建站
  • 怎样做网站轮播如何让百度收录自己的网站信息
  • 网站如何做邮箱订阅杭州seo推广公司
  • 网站做多大的宽高广州网络营销公司
  • 深圳网站建设推广网站推广的一般流程是
  • 网站云优化网址怎么申请注册
  • 义乌网站建设工作室seo排名首页
  • 花卉网站建设策划抖音推广引流平台
  • 网站建设网银开通百度推广客户端手机版下载
  • 赤峰北京网站建设免费网络推广软件有哪些
  • 做网站的人 优帮云百度客服中心人工电话
  • 做网站后端要什么技术微信管理助手