爬取西刺ip代理池

好久没更新博客啦~,今天来更新一篇利用爬虫爬取西刺的代理池的小代码

  先说下需求,我们都是用python写一段小代码去爬取自己所需要的信息,这是可取的,但是,有一些网站呢,对我们的网络爬虫做了一些限制,例如你利用python写了个小爬虫,巴拉巴拉的一劲儿爬人家网页内容,各种下载图片啦,下载视频啥的,然后人家那肯定不让你搞了~,然后尴尬的一幕就出现了,什么呢....防火墙!禁止你在某一段时间登录....给你各种拉黑,那我们有没有什么办法,能特么的不让狗日的拉黑呢,so...我们可以来一些反爬虫的策略,一般来说,我们可以让爬虫爬去网页的内容尽可能的慢一些,或者封装自己的headers,也就是使用浏览器的headers来伪装自己,另外一种,我们可以通过"代理"来实现发爬虫策略,某些网站会对IP地址做限制,例如某个ip地址在一段时间内容访问网站太TMD的快了,要是我,我特么的也不让你玩对吧~,so...我们可以通过伪装ip从而实现继续爬呀爬呀爬,直到爬死小站点~~~渍渍渍!

  好,叨逼完前戏了,咱们进入正题~,本次代码是基于scarpy1.4+python3.6.1的环境+pymysql来保存ip代理池的信息以及利用requests中的get方法以及proxies来实现代理功能,so...没TMD模块的,快去准备吧~

  代码所需环境:

  1. python 3.6.1
  2. scrapy 1.4
  3. requests 
  4. pymysql

  代码分两部分,第一部分为爬取西刺的免费ip代理保存到数据库中,第二部分为从数据库中随机取免费的ip地址,并且判断该ip地址的可用性!!!!!

  ok,先来第一部分的获取西刺免费ip代理的代码~  

 1 #  _*_coding:utf-8_*_
 2 import pymysql
 3 import requests
 4 from scrapy.selector import Selector
 5 
 6 __author__ = 'demon'
 7 
 8 conn = pymysql.connect(host='mysqls数据库的ip地址,换成你自己的!', user='登录MySQL的用户名', passwd='密码!', db='xc_proxy(MySQL的数据库名称)', charset='utf8')
 9 cursor = conn.cursor()
10 
11 
12 def crawl_ips():
13     headers = {
14         "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
15                       "Chrome/59.0.3071.115 Safari/537.36"}
16     for i in range(1, 1001):
17         url = 'http://www.xicidaili.com/wt/{0}'.format(i)
18         req = requests.get(url=url, headers=headers)
19         selector = Selector(text=req.text)
20         all_trs = selector.xpath('//*[@id="ip_list"]//tr')
21 
22         ip_lists = []
23         for tr in all_trs[1:]:
24             speed_str = tr.xpath('td[7]/div/@title').extract()[0]
25             if speed_str:
26                 speed = float(speed_str.split('')[0])
27             ip = tr.xpath('td[2]/text()').extract()[0]
28             port = tr.xpath('td[3]/text()').extract()[0]
29             proxy_type = tr.xpath('td[6]/text()').extract()[0].lower()
30             ip_lists.append((ip, port, speed, proxy_type))
31 
32         for ip_info in ip_lists:
33             cursor.execute(
34                 f"INSERT proxy_ip(ip,port,speed,proxy_type) VALUES('{ip_info[0]}','{ip_info[1]}',{ip_info[2]},"
35                 f"'{ip_info[3]}') "
36             )
37             conn.commit()

   上面的代码呀....卧槽,好懵逼 好懵逼,那他妈的各种xpath是毛线呀~~哈哈哈哈,自己去学习xpath的知识吧~~,这些玩意,我打字也说不明白,so...既然说不明白,那TMD干嘛浪费口水~,总之一句话,我们最后需要的ip代理是这种格式的{'http': 'http://113.105.146.77:8086'},这里面包含了协议ip地址以及端口号~,so...我们需要在页面中提取这些内容,当然,我还提取的速度,因为有些ip地址的速度太TMD慢了~拿来也并没有什么卵用!算了叨逼叨逼两句吧~,我们爬取前1000页中的免费ip地址~然后在代码中实现了获取当前的免费ip地址,端口,以及协议及速度~,然后把提取到的每页中的我们需要的信息到放到一个元祖中,循环每页中的列表,然后把和免费代理ip相关的信息放到数据库中~,so....说到数据库,怕有些人不知道数据库中字段的类型,放上创建数据库字段的代码吧~

  创建数据库及创建存储免费ip代理的表~

  1. CREATE DATABASE xc_proxy CHARSET='utf8';
  2. CREATE TABLE proxy_ip (ip VARCHAR(30)  NOT NULL PRIMARY KEY,port VARCAHR(5) NOT NULL,speed FLOAT NULL,proxy_type VARCAHR(10) NULL);
  3. GRANT ALL PRIVILEGES ON xc_proxy.* TO 'root'@'%' IDENTFIED BY '你要给root用户设置的登录密码';
  4. FLUSH PRIVILEGES;

  proxy_ip表创建成功的信息

  

  ok,上面就是第一步获取免费的ip地址并保存到数据中~,下面我们要做的就是从数据中随机取ip地址并进行ip地址的可用性测试~

  duang duang duang~,第二部分!

 1 class GetIP(object):
 2 
 3     def delete(self,ip):
 4         delete_sql = 'DELETE FROM proxy_ip WHERE ip="{0}"'.format(ip)
 5         cursor.execute(delete_sql)
 6         conn.commit()
 7         return True
 8 
 9     def valid_ip(self, ip, port, proxy_type):
10         headers = {
11             "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
12                           "Chrome/59.0.3071.115 Safari/537.36"}
13         try:
14             proxies = {proxy_type: proxy_type + '://' + ip + ':' + port}
15             req = requests.get('http://ip.chinaz.com/getip.aspx', headers=headers, proxies=proxies, timeout=3)
16         except:
17             print('invalid ip and port')
18             self.delete(ip)
19             return False
20         else:
21             if 200 <= req.status_code < 300:
22                 # print('{0} effective ip~'.format(proxies))
23                 print(req.text)
24                 return True
25             else:
26                 print('invalid ip and port')
27                 self.delete(ip)
28                 return False
29 
30     @property
31     def get_random_ip(self):
32         random_ip = 'SELECT proxy_type,ip, port FROM proxy_ip  ORDER BY RAND()  LIMIT 1;'
33         cursor.execute(random_ip)
34         proxy_type, ip, port = cursor.fetchone()
35         valid_ip = self.valid_ip(ip, port, proxy_type)
36         if valid_ip:
37             return {proxy_type: proxy_type + '://' + ip + ':' + port}
38         else:
39             return self.get_random_ip
40 
41 if __name__ == '__main__':
42     proxy = GetIP()
43     print(proxy.get_random_ip)

   简单的说一下~写了三个方法,分别对应的删除无效的免费ip信息,随机从数据库中取ip地址并做免费ip地址的可用性验证~,实例化类以后,我们调用类中的get_random_ip的方法,从数据中取随机的免费ip地址,并把获取到的ip地址通过拆包的方式分别复制给协议,IP以及端口,然后把这三个参数送给valid_ip方法做验证,如果验证成功,怎返回True,否者先从数据库中删除不能使用的免费ip地址并返回False,如果ip地址不能使用,则继续调用自己,直到ip地址可用未知,ok..就TMD这些东西,有了这些能用免费ip地址,你就可以拿它,嘿嘿嘿嘿~~~

   存放的免费IP地址信息以及数据表结构

  

  多说一句~~免费的ip代理相当的不稳定,如果需要稳定的,那就要充值信仰了,毕竟人民币玩家才是真爱!

  

原文地址:https://www.cnblogs.com/demon89/p/proxy_ip.html