scrapy代理的设置

scrapy代理的设置

在我的上一篇文章介绍了scrapy下载器中间件的使用,这里的scrapyIP的代理就是用这个原理实现的,重写了下载器中间件的process_request(self,request,spider)这个函数,这个函数的主要作用就是对request进行处理。话不多说直接撸代码import random import scrapy import logging class proxMiddleware(object): #proxy_list=[{http: :8123}, {http: :8998}, {http: :80}, {http: :8888}, {http: :80}, {http: :80}, {http: :808}, {http: :808}, {http: :843}, {http: :8118}, {http: :80}, {http: :8123}, {http: :843}, {http: :808}, {http: :808}, {http: :808}, {http: :808}, {http: :8118}, {http: :808}, {http: :808}, {http: :8998}, {http: :808}, {http: :9999}, {http: :8118}, {http: :808}, {http: :8123}] proxy_list=[ ":8888", ":8998", ":808", ":808", ":80", ":80", ":8118", ":8123", ":843", ":808", ":8118", ":808" ] def process_request(self,request,spider): # if not request.meta[proxies]: ip = random.choice(self.proxy_list) print ip #print ip= %ip request.meta[proxy] = ip主要的原理:

给出一个代理列表,然后在这个列表中随机取出一个代理,设置在request中,其中request.meta[proxy]就是设置代理的格式

但是现在主要的问题就是没有代理ip可用,如果去买的话又太贵了,自己玩玩买代理不值当,所以只好自己写爬虫去爬取免费的代理了,但是免费的代理存活的时间是有限的,这是个非常麻烦的事情,我提供的方法就是实现自己的一个ip代理池,每天定时更新自己的代理池,具体的实现方法会在下一篇文章中介绍,现在提供一段代码用来爬取西刺网站的代理直接撸代码,接招吧#coding:utf-8 import requests from bs4 import BeautifulSoup import threading import Queue class Get_ips(): def __init__(self,page): self.ips=[] self.urls=[] for i in range(page): self.urls.append("" + str(i)) self.header = {"User-Agent": Mozilla/5.0 (Windows NT 6.3; WOW64; rv:43.0) Gecko/ Firefox/43.0} #self.file=open("ips",w) self.q=Queue.Queue() self.Lock=threading.Lock() def get_ips(self): for url in self.urls: res = requests.get(url, headers=self.header) soup = BeautifulSoup(res.text, lxml) ips = soup.find_all(tr) for i in range(1, len(ips)): ip = ips[i] tds = ip.find_all("td") ip_temp = "http://" + tds[1].contents[0] + ":" + tds[2].contents[0] # print str(ip_temp) self.q.put(str(ip_temp)) def review_ips(self): while not self.q.empty(): ip=self.q.get() try: proxy={"http": ip} #print proxy res = requests.get("", proxies=proxy,timeout=5) self.Lock.acquire() if res.status_code == 200: self.ips.append(ip) print ip self.Lock.release() except Exception: pass #print error def main(self): self.get_ips() threads=[] for i in range(40): threads.append(threading.Thread(target=self.review_ips,args=[])) for t in threads: t.start() for t in threads: t.join() return self.ips def get_ip(): my=Get_ips(4) return my.main() get_ip()实现的原理

这里用到了BeautifulSoup解析页面,然后将提取到的代理交给队列,然后再通过共享队列分配给线程,这里主要开启线程通过设置代理ip访问一个网站,因为访问网站的时间比较长,因此要开起多个线程,相信大家能够学习设置代理ip了应该都是比较上手的了,这里具体的代码就不一一解释了,如果代码有什么问题可以及时联系我,我的联系方式在关于我的一栏中有提到

补充

想要ip应用起来,还要在配置文件settings中添加DOWNLOADER_MIDDLEWARES = { demo.proxy.proxMiddleware:400 }这里的demo是工程的名字,proxy是py文件的名,proxMiddleware是类的名字

当然这里可能你觉得proxy_list写在这里有点冗余,你可以在配置文件中定义,然后将配置文件的内容import到py文件中以上全是博主慢慢摸索出来的,可以说自学一门技术真的很难,学习python爬虫已经有两三个月了,可以说全是自己通过看项目,网上查资料才有了今天的成功,不过现在还有几个问题没有解决,就是分布式爬虫、移动端爬取,博主接下来就要主攻这两个方面,学好之后会在自己的博客上分享学习心得的,因为网上没有系统的学习教程,对于自学的人来说实在是太痛苦了