爬代理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(未完待续)的更多相关文章

  1. Python 网络编程之网络协议(未完待续)

    一:网络编程从两大架构开始 1.网络开发的两大架构 c/s 架构 : client  server B/S 架构 : Brower  server (1)bs 和 cs 架构之间的关系? (2)哪一种 ...

  2. Python基础:内置类型(未完待续)

    本文根据Python 3.6.5的官文Built-in Types而写. 目录 1.真值测试 2.布尔操作 -- and, or, not 3.比较 4.数字型 -- int, float, comp ...

  3. python 面向对象的基本概念(未完待续)

    面向对象编程简称OOP(Object-oriented-programming),是一种程序设计思想. 面向过程编程(如C语言)指一件事该怎么做,面向对象编程(如Java.python)指一件事该让谁 ...

  4. Scrum 4.0(未完待续)

    看板设计: 每日例会时间定于下午放学回到宿舍,地点是在宿舍外的走廊或宿舍里,特殊情况待定: 团队开会照片: 任务认领: 首页设计-------王俊杰 鸡汤版面-------列志华 论“汤”版面---- ...

  5. python检验代理ip是否可用、代理ip检验

    python检验代理ip是否可用.代理ip检验 安装相关模块: pip install requests 验证代理IP是否可用脚本: import random import telnetlib im ...

  6. 使用IntelliJ IDEA进行Python远程调试的需求(未完)

    使用IntelliJ IDEA进行Python远程调试的需求(未完) 在研究深度学习Machlearning时,有时候需要借助ubuntu搭建的tensorflow环境,另外也有越来越多的运算程序只能 ...

  7. Go web编程学习笔记——未完待续

    1. 1).GOPATH设置 先设置自己的GOPATH,可以在本机中运行$PATH进行查看: userdeMacBook-Pro:~ user$ $GOPATH -bash: /Users/user/ ...

  8. 我的SQL总结---未完待续

    我的SQL总结---未完待续 版权声明:本文为博主原创文章,未经博主允许不得转载. 总结: 主要的SQL 语句: 数据操作(select, insert, delete, update) 访问控制(g ...

  9. MVC丶 (未完待续······)

         希望你看了此小随 可以实现自己的MVC框架     也祝所有的程序员身体健康一切安好                                                     ...

随机推荐

  1. SVN仓库删除最近的提交,还原到某日期以前的版本(svn仓库 删除最近几次更改)

    由于某日删除了SVN仓库的大量内容,现在突然想恢复,又要保留LOG的连贯性(恢复出来的已删除文件,会是新增,没有之前的历史Log了),所以才有了这需求. Dump版本库的版本(457以后版本不要) - ...

  2. .NET中的流

    当应用程序需要和磁盘上的文件打交道的时候,就有了流的概念.流就像架设在应用程序所在内存和磁盘之间的一个管道. 大致思路 → 建立管道 //FileMode.Open打开现有文件,另外还有FileMod ...

  3. HTML5手机APP开发入(4)

    HTML5手机APP开发入(4) 课程内容 完成一个自定义的Component用来展现通讯录用户的明细信息如下图 http://bootsnipp.com/snippets/featured/prof ...

  4. 【Android开发坑系列】之PopupWindow

    PopupWindow在4.0之前的版本有个系统级别的BUG,必须借助一段自定义的fix代码来修复.其中mPopPm就是PopupWindow实例.java.lang.NullPointerExcep ...

  5. Maven Learning - Direct Dependencies & Transitive Dependencies

    Dependencies declared in your project's pom.xml file often have their own dependencies. The main dep ...

  6. mac osx 系统 brew install hadoop 安装指南

    mac osx 系统 brew  install hadoop 安装指南   brew install hadoop 配置 core-site.xml:配置hdfs文件地址(记得chmod 对应文件夹 ...

  7. 处理链方式执行APD处理

    于在处理链的标准处理类型中没有针对APD的处理类型,所以如果APD处理过程设计好后,需要在处理链中安排计划,每天自动运行,就需要用到特殊的处理方法.步骤如下:     1.在se38中运行程序RSAN ...

  8. Fixed error when submitting assignments in Machine Learning on Coursera

    Environment: OS: OSX 10.8.5 Matlab: R2013a(8.1.0.604) 64bit   How to fix: In file submit.m, line 129 ...

  9. 使用magick.net将pdf转换为图片

    现在手上有个需求是要将pdf转换为一页一页的image.最开始找到的是pdfbox来处理pdf的.在pdfbox.apache.org的官网首页写了一句'convert you pdfs to ima ...

  10. 如何做好IT运营.

    定义IT管理的重点在于业务策略与 IT 部门提供的服务之间的一致性.IT 管理可建立必要的管理机制来确保可预测的 IT 服务交付,从而确保业务流程和 IT 流程之间的联系.IT 管理传统上属于CIO. ...