# 嗯,。。。因为经常需要使用代理去抓一点东西,就有了下面一段代码,第一版不是很好,后面用到了再来优化

import re,pymysql,time,redis
from urllib.request import Request
from urllib.request import urlopen
headers={
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36',
} url = 'http://www.xicidaili.com/wt/'
db = pymysql.connect(host='127.0.0.1', user='root', password="liu",
database='test', port=3306, charset='utf8')
cur = db.cursor()
def url_response(url,cur):
response = urlopen(Request(url,headers=headers)).read()
response = response.decode()
pattern='<td>(.*?)</td>\s+<td>(\d+)</td>\s+<td>\s+<a href="/.*?">[\u4e00-\u9fa5]+</a>\s+</td>\s+<td class="country">高匿</td>\s+<td>(\w+)</td>\s+<td class="country">\s+<div title="(\d.\d+)秒"'
regex = re.compile(pattern)
ip_list = regex.findall(response)
for i in ip_list:
out_time = float(i[3])
ip_ = i[0]+':'+i[1]
sql = 'select ip_ from ip where ip_ = "%s"'%ip_
cur.execute(sql)
if cur.fetchone():
print('重复数据跳过')
continue
if out_time < 1:
sql = "insert into ip(ip_,time_,xy_) values('%s','%s','%s')"%(ip_,out_time,i[2])
cur.execute(sql)
print('插入成功,',i)
else:
pass for i in range(1,3):
_ = url+str(i)
url_response(_,cur)
db.commit()
time.sleep(2)
# 第一版使用 mysql存着也没啥用处 ,然后就给来了redis
# 加入线程池的使用,让抓取更加速度 import re,time,redis
from concurrent.futures import ThreadPoolExecutor
from urllib.request import Request
from urllib.request import urlopen
headers={
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36',
}
url = 'http://www.xicidaili.com/wt/'
class R(object):
def __init__(self):
r_pool =redis.ConnectionPool(host='127.0.0.1',db=0,password=None,
port=6379)
self.redis_obj = redis.Redis(connection_pool=r_pool)
def setex(self,name,value,time):
return self.redis_obj.setex(name,value,time) def get(self,name):
return self.redis_obj.get(name) def url_response(url,redis_obj):
response = urlopen(Request(url,headers=headers)).read()
response = response.decode()
pattern='<td>(.*?)</td>\s+<td>(\d+)</td>\s+<td>\s+<a href="/.*?">[\u4e00-\u9fa5]+</a>\s+</td>\s+<td class="country">高匿</td>\s+<td>(\w+)</td>\s+<td class="country">\s+<div title="(\d.\d+)秒"'
regex = re.compile(pattern)
ip_list = regex.findall(response)
for i in ip_list:
out_time = float(i[3])
ip_ = i[0]+':'+i[1]
if redis_obj.get(ip_):
print('重复数据跳过')
continue
if out_time < 1:
redis_obj.setex(ip_,1,60*30)
print('插入成功,',ip_)
else:
pass
r = R()
T = ThreadPoolExecutor(4)
for i in range(1,5):
_ = url+str(i)
T.submit(url_response,_,r)
print('执行完成 ')
T.shutdown()

更新第二版 ,使用redis___西刺



2018-12-17:

  第二版出错更新: 15行 :return self.redis_obj.setex(name,time,value)  #此处已改正

# python 3.7

from lxml import etree
import requests,time,redis class Kuai_IP(object):
def __init__(self):
self.headers = {
'Host': 'www.kuaidaili.com',
'Upgrade-Insecure-Requests': '',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36',
'Referer': 'https://www.kuaidaili.com/free/inha/1/'
}
self.static='https://www.kuaidaili.com/free/inha/%s/'
Con_pool = redis.ConnectionPool(host='127.0.0.1')
self.r = redis.Redis(connection_pool=Con_pool) def getPage(self,page_index):
if page_index==1:
self.headers['Referer']='https://www.kuaidaili.com/free/inha/'
else:
self.headers['Referer']='https://www.kuaidaili.com/free/inha/'+str(page_index-1)+'/'
res = requests.get(url=self.static%page_index,headers=self.headers)
self.parse(res.text) def parse(self,res):
html = etree.HTML(res)
r_list = html.xpath('//tbody/tr/td/text()')
if r_list:
for i in range(1, int(len(r_list) / 7)):
_ =r_list[i * 7:(i + 1) * 7]
self.r.setex(_[3]+'://'+_[0]+':'+_[1],30,_[3])
print(_)
else:
print(r_list) def work_on(self):
page_index = 2 # 爬取页数
for i in range(1,page_index+1):
self.getPage(i)
print(i, '---------')
time.sleep(2) if __name__ == '__main__':
ip = Kuai_IP()
ip.work_on()

______快代理IP——没做过滤



2018-12-20

  嗯,这次由于用到的代理比较多,就把西刺和快代理的代码合到了一起,没做什么大的改进,

  1 代理ip格式全部成为 requests代理的形式{'http':'xxx://xx.xx.xx.xx:xxx'} 方便requests的调用

 

# -*- coding:utf-8 -*-
# @time:2018-12-20 22:23 import re,redis,time,requests
from concurrent.futures import ThreadPoolExecutor
from urllib.request import Request
from urllib.request import urlopen page = 10 #定义抓取页数,由于快代理一页的ip比较少,然后我就在此的基础上+10 headers={
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36',
}
url = 'http://www.xicidaili.com/wt/'
class R(object):
def __init__(self):
r_pool =redis.ConnectionPool(host='127.0.0.1',db=0,password=None,
port=6379)
self.redis_obj = redis.Redis(connection_pool=r_pool)
def setex(self,name,value,time):
return self.redis_obj.setex(name, value, time) def get(self,name):
return self.redis_obj.get(name) def url_response(url,redis_obj):
response = urlopen(Request(url,headers=headers)).read()
response = response.decode()
pattern='<td>(.*?)</td>\s+<td>(\d+)</td>\s+<td>\s+<a href="/.*?">[\u4e00-\u9fa5]+</a>\s+</td>\s+<td class="country">高匿</td>\s+<td>(\w+)</td>\s+<td class="country">\s+<div title="(\d.\d+)秒"'
regex = re.compile(pattern)
ip_list = regex.findall(response)
for i in ip_list:
out_time = float(i[3])
ip_ = i[0]+':'+i[1]
if redis_obj.get(ip_):
print('重复数据跳过')
continue
if out_time < 1:
ip_ = "HTTP://"+str(ip_)
redis_obj.setex(ip_,1,60*30*20)
print('插入成功,',ip_)
else:
pass from lxml import etree
class Kuai_IP(object):
def __init__(self):
self.headers = {
'Host': 'www.kuaidaili.com',
'Upgrade-Insecure-Requests': '',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36',
'Referer': 'https://www.kuaidaili.com/free/inha/1/'
}
self.static='https://www.kuaidaili.com/free/inha/%s/'
Con_pool = redis.ConnectionPool(host='127.0.0.1',port=6379,db=0)
self.r = redis.Redis(connection_pool=Con_pool) def getPage(self,page_index):
if page_index==1:
self.headers['Referer']='https://www.kuaidaili.com/free/inha/'
else:
self.headers['Referer']='https://www.kuaidaili.com/free/inha/'+str(page_index-1)+'/'
res = requests.get(url=self.static%page_index,headers=self.headers)
self.parse(res.text) def parse(self,res):
html = etree.HTML(res)
r_list = html.xpath('//tbody/tr/td/text()')
if r_list:
for i in range(1, int(len(r_list) / 7)):
_ =r_list[i * 7:(i + 1) * 7]
self.r.setex(_[3]+'://'+_[0]+':'+_[1],_[3],30*60*24)
print(_)
else:
print(r_list) def work_on(self):
page_index = page+10 # 爬取页数
for i in range(1,page_index+1):
self.getPage(i)
print(i, '---------')
time.sleep(2) if __name__ == '__main__':
r = R()
T = ThreadPoolExecutor(4)
for i in range(1,page):
_ = url+str(i)
T.submit(url_response,_,r)
print('执行完成 ')
T.shutdown()
ip = Kuai_IP()
ip.work_on()

---第三版融合,总共将近500个ip,应该是够用的



2018-12-24

  嗯,上面代理在80行出现错误,因为快代理的这个超时时间有时出现的是数字+文字,然后在设置缓存的时候就

  出现了【 value is not an integer or out of range】

# -*- coding:utf-8 -*-
# @time:2018-12-18 22:23
# @Auther:1043453579@qq.com import re,redis,time,requests
from concurrent.futures import ThreadPoolExecutor
from urllib.request import Request
from urllib.request import urlopen page = 10
headers={
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36',
}
url = 'http://www.xicidaili.com/wt/'
class R(object):
def __init__(self):
r_pool =redis.ConnectionPool(host='127.0.0.1',db=0,password=None,
port=6379)
self.redis_obj = redis.Redis(connection_pool=r_pool)
def setex(self,name,value,time):
return self.redis_obj.setex(name, time, value) def get(self,name):
return self.redis_obj.get(name) def url_response(url,redis_obj):
response = urlopen(Request(url,headers=headers)).read()
response = response.decode()
pattern='<td>(.*?)</td>\s+<td>(\d+)</td>\s+<td>\s+<a href="/.*?">[\u4e00-\u9fa5]+</a>\s+</td>\s+<td class="country">高匿</td>\s+<td>(\w+)</td>\s+<td class="country">\s+<div title="(\d.\d+)秒"'
regex = re.compile(pattern)
ip_list = regex.findall(response)
for i in ip_list:
out_time = float(i[3])
ip_ = i[0]+':'+i[1]
if redis_obj.get(ip_):
print('重复数据跳过')
continue
if out_time < 1:
ip_ = "HTTP://"+str(ip_)
redis_obj.setex(ip_,1,60*30*20)
print('插入成功,',ip_)
else:
pass
r = R()
T = ThreadPoolExecutor(4)
for i in range(1,page):
_ = url+str(i)
T.submit(url_response,_,r)
print('执行完成 ')
T.shutdown() from lxml import etree
class Kuai_IP(object):
def __init__(self):
self.headers = {
'Host': 'www.kuaidaili.com',
'Upgrade-Insecure-Requests': '',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36',
'Referer': 'https://www.kuaidaili.com/free/inha/1/'
}
self.static='https://www.kuaidaili.com/free/inha/%s/'
Con_pool = redis.ConnectionPool(host='127.0.0.1',port=6379,db=0)
self.r = redis.Redis(connection_pool=Con_pool) def getPage(self,page_index):
if page_index==1:
self.headers['Referer']='https://www.kuaidaili.com/free/inha/'
else:
self.headers['Referer']='https://www.kuaidaili.com/free/inha/'+str(page_index-1)+'/'
res = requests.get(url=self.static%page_index,headers=self.headers)
self.parse(res.text) def parse(self,res):
html = etree.HTML(res)
r_list = html.xpath('//tbody/tr/td/text()')
if r_list:
for i in range(1, int(len(r_list) / 7)):
_ =r_list[i * 7:(i + 1) * 7]
print('',_)
#exit()
self.r.setex(_[3]+'://'+_[0]+':'+_[1],30*60*24,30*60*24)
# print(_)
else:
print(r_list) def work_on(self):
page_index = page+10 # 爬取页数
for i in range(1,page_index+1):
self.getPage(i)
print(i, '---------')
time.sleep(2) ip = Kuai_IP()
ip.work_on()

---第四版融合,将近500+ip,应该是够用的

采集代理ip 地址【西刺,快代理】的更多相关文章

  1. 免费代理IP地址列表

    代理地址最后验证日期:2017-8-28 纯真 66免费代理网 #推荐 西刺免费代理IP 酷伯伯HTTP代理 快代理 proxy360.cn 站大爷 Free Proxy List 年少#不稳定 全网 ...

  2. 爬取西刺网代理ip,并把其存放mysql数据库

    需求: 获取西刺网代理ip信息,包括ip地址.端口号.ip类型 西刺网:http://www.xicidaili.com/nn/ 那,如何解决这个问题? 分析页面结构和url设计得知: 数据都在本页面 ...

  3. 采集15个代理IP网站,打造免费代理IP池

    采集的站点: 免费代理IP http://ip.yqie.com/ipproxy.htm66免费代理网 http://www.66ip.cn/89免费代理 http://www.89ip.cn/无忧代 ...

  4. python测试代理IP地址

    代码: # -*- coding: utf-8 -*- import urllib,urllib2,re from random import choice from scrapy.selector ...

  5. 常见的User-Agent及免费代理IP网站

    常见的User-Agent 1.Android Mozilla/5.0 (Linux; Android 4.1.1; Nexus 7 Build/JRO03D) AppleWebKit/535.19 ...

  6. 爬虫反爬之代理IP

    爬虫反爬之代理IP 代理IP其实本就是在requests模块中的参数 定义: 代替原来的IP地址去对接网络的IP地址. 作用: 隐藏自身真实IP,避免被封. 获取代理IP网站 西刺代理.快代理.全网代 ...

  7. 代理 IP 云打码平台的使用

    代理ip 获取代理ip的网站: 快代理 西祠代理 www.goubanjia.com #代理ip import requests headers = { 'User-Agent':'Mozilla/5 ...

  8. 代理ip的使用以及多进程爬取

    一.代理皮的简单使用 简单的看一二例子即可 import requests #代理ip 高频的ip容易被封,所以使用ip代理 #免费代理 ip:www.goubanjia.com 快代理 西祠代理 h ...

  9. 基于后端和爬虫创建的代理ip池

    搭建免费的代理ip池 需要解决的问题: 使用什么方式存储ip 文件存储 缺点: 打开文件修改文件操作较麻烦 mysql 缺点: 查询速度较慢 mongodb 缺点: 查询速度较慢. 没有查重功能 re ...

随机推荐

  1. 算法习题---5.7丑数(Uva136)

    一:题目 丑数是指不能被除了2,,5以外的素数整除的数.将丑数从小到大排序 ,,,,,,,,,,,.... 求第1500个丑数 (一)求解方法 对于任意丑数x,他的2x,3x,5x都是丑数. 二:代码 ...

  2. pip 使用国内源安装第三方库

    pip3 install django -i http://mirrors.aliyun.com/pypi/simple --trusted-host mirrors.aliyun.com​

  3. Python - Django - session 的基本使用

    urls.py: from django.conf.urls import url from app02 import views urlpatterns = [ # app02 url(r'^app ...

  4. angular2 ng-if

    ng-if <td ><div class="td-li" > <a (click)="open(i)" class=" ...

  5. Python爬取网址中多个页面的信息

    通过上一篇博客了解到爬取数据的操作,但对于存在多个页面的网址来说,使用上一篇博客中的代码爬取下来的资料并不完整.接下来就是讲解该如何爬取之后的页面信息. 一.审查元素 鼠标移至页码处右键,选择检查元素 ...

  6. publish dotnet core angular spa app to docker

    公司一个使用Angular开发的应用准备下个版本使用.Net Core开发后台, 刚好可以用到.Net Core Angular Spa模板, 而且最近也在学习Docker, 于是就想把它融汇贯通, ...

  7. mac install azure-cli

    安装 CLI 时,可以先更新 brew 存储库信息,然后运行 install 命令: brew update && brew install azure-cli 更新: brew up ...

  8. [转帖]TPC-C解析系列03_TPC-C基准测试之SQL优化

    TPC-C解析系列03_TPC-C基准测试之SQL优化 http://www.itpub.net/2019/10/08/3330/ TPC-C是一个非常严苛的基准测试模型,考验的是一个完备的关系数据库 ...

  9. Linux基础-09-磁盘分区、挂载及文件系统管理

    1. 硬件设备与文件名的对应关系 1) 在Linux系统中,每个设备都被当初一个文件来对待. 2) 各种设备在Linux中的文件名 2. 硬盘的结构及硬盘分区 1) 为什么要进行硬盘分区: a) 更容 ...

  10. Python【变量和赋值】

    name = '千变万化' #把“千变万化”赋值给了“name”这个[变量] >>> name = '一'>>> name = '二'>>> pr ...