[python]爬代理ip v2.0(未完待续)
爬代理ip
所有的代码都放到了我的github上面,
HTTP代理常识
HTTP代理按匿名度可分为透明代理、匿名代理和高度匿名代理。
特别感谢:勤奋的小孩 在评论中指出我文章中的错误。
REMOTE_ADDR
HTTP_VIA
HTTP_X_FORWARDED_FOR
你写的这三个,第一个是网络层的信息,不属于HTTP的头部,后两个在HTTP头部的名称也是不含“HTTP_”的
wiki中关于代理的解释也出现了这个错误:
因为我挂的代理,无法修改wiki上的这个错误,希望可以修改的同学可以编辑修改之,方便以后查阅的同学。
代理请求的示例,参考:
GET / HTTP/1.1
Host: [scrubbed server host]:8080
Connection: keep-alive
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-ms-application, application/vnd.ms-xpsdocument, application/xaml+xml, application/x-ms-xbap, */*
Accept-Language: ru
UA-CPU: x86
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; SLCC1; .NET CLR 2.0.50727; .NET CLR 3.0.04506)
X-Forwarded-For: [scrubbed client's real IP address]
Via: 1.1 proxy11 (NetCache NetApp/5.6.1D24)
1.使用透明代理,对方服务器可以知道你使用了代理,并且也知道你的真实IP。
透明代理访问对方服务器所带的HTTP头信息如下:
VIA = 代理服务器IP
X_FORWARDED_FOR = 你的真实IP
透明代理还是将你的真实IP发送给了对方服务器,因此无法达到隐藏身份的目的。
2.使用匿名代理,对方服务器可以知道你使用了代理,但不知道你的真实IP。
匿名代理访问对方服务器所带的HTTP头信息如下:
VIA = 代理服务器IP
X_FORWARDED_FOR = 代理服务器IP
匿名代理隐藏了你的真实IP,但是向访问对象透露了你是使用代理服务器访问他们的。
3.使用高匿名代理,对方服务器不知道你使用了代理,更不知道你的真实IP。
高匿名代理访问对方服务器所带的HTTP头信息如下:
VIA 不显示
X_FORWARDED_FOR 不显示
高匿名代理隐藏了你的真实IP,同时访问对象也不知道你使用了代理,因此隐蔽度最高。
概述
起因:我这次是准备爬取‘高匿的ip’,做一个ip库,方便后面的爬虫。这是因为,很多网站或者api接口,都设置了‘访问间隔时间’(一个ip有访问次数的限制,超过次数就需要进入‘冷却CD’)。所以,用我的真实ip,无法高效、快速的爬取内容。
因为工作中使用tornado框架,它带一个很好用的HTTPClient的库,所以这次我就直接用它来完成,爬代理ip的工作。我写了一个Spider类,用于爬url的内容。Content用于存储内容。
class Spider(object):
"""
爬取
"""
def __init__(self, url, **kwargs):
# 实例化HTTPRequest对象,用于伪造浏览器的请求
self.request = HTTPRequest(url, **dict(CLIENT_CONFIG, **kwargs))
def get(self, **kwargs):
return HTTPClient().fetch(self.request, **kwargs)
def post(self):
self.request.method = 'POST'
return HTTPClient().fetch(self.request)
class Content(object):
"""
存储内容到数据库
"""
def __init__(self):
self.url = None
self.content = None
def get_content(self, url, content):
self.url = url
self.content = content
def save(self):
create_time = datetime.datetime.now()
data = models.Data(url=self.url, content=self.content, create_time=create_time)
data.insert()
爬目标网站
目标网站:国内高匿代理ip,在爬虫v1.0中,当时爬的太顺利了,直接爬就行了,根本不用设置HTTP头。
1. 所以在爬这次的目标网站的时候,就遇到了错误。最后,因为需要设置头为长连接,否则会返回Timeout。所以爬虫v2.0,我就建立了一个配置文件,里面设置好了相关的头信息。
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#
# Author : XueWeiHan
# E-mail : 595666367@qq.com
# Date : 16/4/22 下午6:39
# Desc : 客户端请求的常用数据
CLIENT_CONFIG = {
'headers': {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2)'
' AppleWebKit/537.36 (KHTML, like Gecko) Chrome/'
'49.0.2623.110 Safari/537.36',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0'
'.9,image/webp,*/*;q=0.8',
'Accept-Encoding': 'gzip, deflate, sdch',
'Accept-Language': 'zh-CN,zh;q=0.8,en;q=0.6',
'Cache-Control': 'max-age=0',
'Connection': 'keep-alive'
}
}
2. 目前为止,爬虫的配置已经做好了,下面就是具体的爬取内容的逻辑了。代码如下:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#
# Author : XueWeiHan
# E-mail : 595666367@qq.com
# Date : 16/4/23 上午10:40
# Desc : 获取ip
from spider import Spider, Content
s = Spider('http://www.xicidaili.com/nn/')
print s.get().code # 输出为:200
# 表示成功获取到url内容,下面开始分析内容,提取内容
3. 接下来和爬虫v1.0一样,分析网站的内容,这次我是使用的'BeautifulSoup'库。使用这个库,就相当于js中的jquery。使用它的选择器,获取页面元素变的便利BeautifulSoup官方文档
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#
# Author : XueWeiHan
# E-mail : 595666367@qq.com
# Date : 16/4/23 上午10:40
# Desc : 获取代理ips
from bs4 import BeautifulSoup
from spider import Spider
def get_ip_info(html_response):
""" 清理内容得到IP信息 """
ips_list = []
soup = BeautifulSoup(html_response.body, "html.parser")
ip_list_table = soup.find(id='ip_list')
for ip_info in ip_list_table.find_all('tr'):
ip_detail = ip_info.find_all('td')
if ip_detail:
ips_list.append(dict(ip=list(ip_detail)[2].string,
port=list(ip_detail)[3].string))
return ips_list
s = Spider('http://www.xicidaili.com/nn/')
response = s.get()
ips = get_ip_info(response)
import pprint
pprint.pprint(ips)
#输出如下:
[{'ip': u'110.73.1.204', 'port': u'8123'},
{'ip': u'171.39.0.98', 'port': u'8123'},
....
{'ip': u'113.85.116.223', 'port': u'9999'}]
4. ip都已经获取到了,下面就是把它存起来了。我修改了Content类,提供了存到文件中的方法。代码如下:
class Content(object):
"""
存储内容到数据库
"""
def __init__(self, model=None):
self.model = model
def save(self, kwargs):
if self.model:
data = self.model(**kwargs)
data.insert()
else:
print 'no model'
@staticmethod
def save_to_file(all_content, str_split=':', path='./data.txt'):
"""
把数据存到文件中
:param all_content: 需要是list类型
:param str_split: 分割符号
:param path: 文件位置,默认为当前脚本运行的位置,文件名:data.txt
"""
with open(path, 'w') as fb:
print '开始写入文件'
for content in all_content:
content_str = ''
for k, v in content.items():
content_str += v + str_split
fb.write(content_str+'\n')
print '写入文件完成'
TODO
未完待续,电脑要没电了,还没带电源。。。。
[python]爬代理ip v2.0(未完待续)的更多相关文章
- Python 网络编程之网络协议(未完待续)
一:网络编程从两大架构开始 1.网络开发的两大架构 c/s 架构 : client server B/S 架构 : Brower server (1)bs 和 cs 架构之间的关系? (2)哪一种 ...
- Python基础:内置类型(未完待续)
本文根据Python 3.6.5的官文Built-in Types而写. 目录 1.真值测试 2.布尔操作 -- and, or, not 3.比较 4.数字型 -- int, float, comp ...
- python 面向对象的基本概念(未完待续)
面向对象编程简称OOP(Object-oriented-programming),是一种程序设计思想. 面向过程编程(如C语言)指一件事该怎么做,面向对象编程(如Java.python)指一件事该让谁 ...
- Scrum 4.0(未完待续)
看板设计: 每日例会时间定于下午放学回到宿舍,地点是在宿舍外的走廊或宿舍里,特殊情况待定: 团队开会照片: 任务认领: 首页设计-------王俊杰 鸡汤版面-------列志华 论“汤”版面---- ...
- python检验代理ip是否可用、代理ip检验
python检验代理ip是否可用.代理ip检验 安装相关模块: pip install requests 验证代理IP是否可用脚本: import random import telnetlib im ...
- 使用IntelliJ IDEA进行Python远程调试的需求(未完)
使用IntelliJ IDEA进行Python远程调试的需求(未完) 在研究深度学习Machlearning时,有时候需要借助ubuntu搭建的tensorflow环境,另外也有越来越多的运算程序只能 ...
- Go web编程学习笔记——未完待续
1. 1).GOPATH设置 先设置自己的GOPATH,可以在本机中运行$PATH进行查看: userdeMacBook-Pro:~ user$ $GOPATH -bash: /Users/user/ ...
- 我的SQL总结---未完待续
我的SQL总结---未完待续 版权声明:本文为博主原创文章,未经博主允许不得转载. 总结: 主要的SQL 语句: 数据操作(select, insert, delete, update) 访问控制(g ...
- MVC丶 (未完待续······)
希望你看了此小随 可以实现自己的MVC框架 也祝所有的程序员身体健康一切安好 ...
随机推荐
- Why Apache Spark is a Crossover Hit for Data Scientists [FWD]
Spark is a compelling multi-purpose platform for use cases that span investigative, as well as opera ...
- 使用 Aircrack-ng 破解 WEP 和 WPA/WPA2 加密的 Wi-Fi 密码。(转)
1.首先请不要使用此方法去搞破坏,去蹭Wi-Fi,因为不装逼地说,我认为技术本身的价值很大,尤其是在学习这个技术的过程中解决遇到的问题,当经过重重困难最后终于成功之后的喜悦又怎么能拿去蹭网呢.我在此过 ...
- MAC下的命令操作
打印环境变量:echo $PATH设置环境变量:export PATH=$PATH:/usr/local/git/bin应用:在git-scm下载git2.0.1版本,图形安装后,直接在终端敲giv ...
- TCP_NODELAY 和 TCP_CORK主要区别
一句话总结: tcp_nodelay:禁止nagle算法,有需要发送的就立即发送,比较常见 tcp_cork:它是一种加强的nagle算法,过程和nagle算法类似,都是累计数据然后发送.但它没有 n ...
- 【C/C++】随机数问题
最初问题:从n个数中随机选择m个数(0<=m<=n). 为了便于描述,可以将该问题抽象为:从0-n-1这n个数中随机选择m个数.计算机能够提供的随机数都是伪随机的,我们假设计算机提供的伪随 ...
- Codeforces Round #384 (Div. 2) E. Vladik and cards 状压dp
E. Vladik and cards 题目链接 http://codeforces.com/contest/743/problem/E 题面 Vladik was bored on his way ...
- 导出websphere内存镜像
1. 将脚本放致profiles\appservername\bin下 2. 查看一下soap host(在控制台port中能够看到) 3. 运行例如以下命令:./wsa ...
- .NET 程序在 Windows XP 下调用 SHA512CryptoServiceProvider 方法报 PlatformNotSupportedException 异常
转自:http://stackoverflow.com/questions/1293905/sha256cryptoserviceprovider-and-related-possible-to-us ...
- [原]unity5 AssetBundle打包
本文unity版本5.1.3 一.现有的打包教程: 1.http://liweizhaolili.blog.163.com/blog/static/16230744201541410275298/ 阿 ...
- Maven3路程(四)用Maven创建Struts2项目
采用struts版本:struts-2.3.8 一.创建一个web项目 参考前面文章,项目名:maven-struts-demo. 二.配置pom.xml文件添加struts2依赖 <proje ...