- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章通过Python爬虫代理IP快速增加博客阅读量由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
写在前面 。
题目所说的并不是目的,主要是为了更详细的了解网站的反爬机制,如果真的想要提高博客的阅读量,优质的内容必不可少.
了解网站的反爬机制 。
一般网站从以下几个方面反爬虫:
1. 通过Headers反爬虫 。
从用户请求的Headers反爬虫是最常见的反爬虫策略。很多网站都会对Headers的User-Agent进行检测,还有一部分网站会对Referer进行检测(一些资源网站的防盗链就是检测Referer).
如果遇到了这类反爬虫机制,可以直接在爬虫中添加Headers,将浏览器的User-Agent复制到爬虫的Headers中;或者将Referer值修改为目标网站域名。对于检测Headers的反爬虫,在爬虫中修改或者添加Headers就能很好的绕过.
2. 基于用户行为反爬虫 。
还有一部分网站是通过检测用户行为,例如同一IP短时间内多次访问同一页面,或者同一账户短时间内多次进行相同操作.
大多数网站都是前一种情况,对于这种情况,使用IP代理就可以解决。我们可以将代理IP检测之后保存在文件当中,但这种方法并不可取,代理IP失效的可能性很高,因此从专门的代理IP网站实时抓取,是个不错的选择.
对于第二种情况,可以在每次请求后随机间隔几秒再进行下一次请求。有些有逻辑漏洞的网站,可以通过请求几次,退出登录,重新登录,继续请求来绕过同一账号短时间内不能多次进行相同请求的限制.
还有针对cookies,通过检查cookies来判断用户是否是有效用户,需要登录的网站常采用这种技术。更深入一点的还有,某些网站的登录会动态更新验证,如推酷登录时,会随机分配用于登录验证的authenticity_token,authenticity_token会和用户提交的登录名和密码一起发送回服务器.
3. 基于动态页面的反爬虫 。
有的时候将目标页面抓取下来,发现关键的信息内容空白一片,只有框架代码,这是因为该网站的信息是通过用户Post的XHR动态返回内容信息,解决这种问题的方法就是通过开发者工具(FireBug等)对网站流进行分析,找到单独的内容信息request(如Json),对内容信息进行抓取,获取所需内容.
更复杂一点的还有对动态请求加密的,参数无法解析,也就无法进行抓取。这种情况下,可以通过Mechanize,selenium RC,调用浏览器内核,就像真实使用浏览器上网那样抓取,可以最大限度的抓取成功,只不过效率上会打些折扣。笔者测试过,用urllib抓取拉勾网招聘信息30页所需时间为三十多秒,而用模拟浏览器内核抓取需要2——3分钟.
4. 限定某些IP访问 。
免费的代理IP可以从很多网站获取到,既然爬虫可以利用这些代理IP进行网站抓取,网站也可以利用这些代理IP反向限制,通过抓取这些IP保存在服务器上来限制利用代理IP进行抓取的爬虫.
进入正题 。
好了,现在实际操作一下,编写一个通过代理IP访问网站的爬虫.
首先获取代理IP,用来抓取.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
def
Get_proxy_ip():
headers
=
{
'Host'
:
'www.xicidaili.com'
,
'User-Agent'
:
'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)'
,
'Accept'
: r
'application/json, text/javascript, */*; q=0.01'
,
'Referer'
: r
'http://www.xicidaili.com/'
,
}
req
=
request.Request(r
'http://www.xicidaili.com/nn/'
, headers
=
headers)
#发布代理IP的网站
response
=
request.urlopen(req)
html
=
response.read().decode(
'utf-8'
)
proxy_list
=
[]
ip_list
=
re.findall(r
'\d+\.\d+\.\d+\.\d+'
,html)
port_list
=
re.findall(r
'<td>\d+</td>'
,html)
for
i
in
range
(
len
(ip_list)):
ip
=
ip_list[i]
port
=
re.sub(r
'<td>|</td>'
, '', port_list[i])
proxy
=
'%s:%s'
%
(ip,port)
proxy_list.append(proxy)
return
proxy_list
|
顺带一提,有些网站会通过检查代理IP的真实IP来限制爬虫抓取。这里就要稍微提一下代理IP的知识.
代理IP里的“透明”“匿名”“高匿”分别是指?
透明代理的意思是客户端根本不需要知道有代理服务器的存在,但是它传送的仍然是真实的IP。使用透明IP,就无法绕过通过一定时间内IP访问次数的限制.
普通匿名代理能隐藏客户机的真实IP,但会改变我们的请求信息,服务器端有可能会认为我们使用了代理。不过使用此种代理时,虽然被访问的网站不能知道你的ip地址,但仍然可以知道你在使用代理,这样的IP就会被网站禁止访问.
高匿名代理不改变客户机的请求,这样在服务器看来就像有个真正的客户浏览器在访问它,这时客户的真实IP是隐藏的,网站就不会认为我们使用了代理.
综上所述,爬虫代理IP最好使用“高匿IP” 。
user_agent_list包含了目前主流浏览器请求的RequestHeaders的user-agent,通过它我们可以模仿各类浏览器的请求.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
user_agent_list
=
[
'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/45.0.2454.85 Safari/537.36 115Browser/6.0.3'
,
'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50'
,
'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50'
,
'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)'
,
'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)'
,
'Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1'
,
'Opera/9.80 (Windows NT 6.1; U; en) Presto/2.8.131 Version/11.11'
,
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11'
,
'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; SE 2.X MetaSr 1.0; SE 2.X MetaSr 1.0; .NET CLR 2.0.50727; SE 2.X MetaSr 1.0)'
,
'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0'
,
'Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1'
,
]
|
通过设定随机等待时间来访问网站,可以绕过某些网站对于请求间隔的限制.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
def
Proxy_read(proxy_list, user_agent_list, i):
proxy_ip
=
proxy_list[i]
print
(
'当前代理ip:%s'
%
proxy_ip)
user_agent
=
random.choice(user_agent_list)
print
(
'当前代理user_agent:%s'
%
user_agent)
sleep_time
=
random.randint(
1
,
3
)
print
(
'等待时间:%s s'
%
sleep_time)
time.sleep(sleep_time)
#设置随机等待时间
print
(
'开始获取'
)
headers
=
{
'Host'
:
's9-im-notify.csdn.net'
,
'Origin'
:
'http://blog.csdn.net'
,
'User-Agent'
: user_agent,
'Accept'
: r
'application/json, text/javascript, */*; q=0.01'
,
'Referer'
: r
'http://blog.csdn.net/u010620031/article/details/51068703'
,
}
proxy_support
=
request.ProxyHandler({
'http'
:proxy_ip})
opener
=
request.build_opener(proxy_support)
request.install_opener(opener)
req
=
request.Request(r
'http://blog.csdn.net/u010620031/article/details/51068703'
,headers
=
headers)
try
:
html
=
request.urlopen(req).read().decode(
'utf-8'
)
except
Exception as e:
print
(
'******打开失败!******'
)
else
:
global
count
count
+
=
1
print
(
'OK!总计成功%s次!'
%
count)
|
以上就是爬虫使用代理的相关知识点,虽然还很浅显,但大部分场景是可以应付的了的.
附上源码 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
|
#! /usr/bin/env python3
from
urllib
import
request
import
random
import
time
import
lxml
import
re
user_agent_list
=
[
'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/45.0.2454.85 Safari/537.36 115Browser/6.0.3'
,
'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50'
,
'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50'
,
'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)'
,
'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)'
,
'Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1'
,
'Opera/9.80 (Windows NT 6.1; U; en) Presto/2.8.131 Version/11.11'
,
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11'
,
'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; SE 2.X MetaSr 1.0; SE 2.X MetaSr 1.0; .NET CLR 2.0.50727; SE 2.X MetaSr 1.0)'
,
'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0'
,
'Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1'
,
]
count
=
0
def
Get_proxy_ip():
headers
=
{
'Host'
:
'www.xicidaili.com'
,
'User-Agent'
:
'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)'
,
'Accept'
: r
'application/json, text/javascript, */*; q=0.01'
,
'Referer'
: r
'http://www.xicidaili.com/'
,
}
req
=
request.Request(r
'http://www.xicidaili.com/nn/'
, headers
=
headers)
response
=
request.urlopen(req)
html
=
response.read().decode(
'utf-8'
)
proxy_list
=
[]
ip_list
=
re.findall(r
'\d+\.\d+\.\d+\.\d+'
,html)
port_list
=
re.findall(r
'<td>\d+</td>'
,html)
for
i
in
range
(
len
(ip_list)):
ip
=
ip_list[i]
port
=
re.sub(r
'<td>|</td>'
, '', port_list[i])
proxy
=
'%s:%s'
%
(ip,port)
proxy_list.append(proxy)
return
proxy_list
def
Proxy_read(proxy_list, user_agent_list, i):
proxy_ip
=
proxy_list[i]
print
(
'当前代理ip:%s'
%
proxy_ip)
user_agent
=
random.choice(user_agent_list)
print
(
'当前代理user_agent:%s'
%
user_agent)
sleep_time
=
random.randint(
1
,
3
)
print
(
'等待时间:%s s'
%
sleep_time)
time.sleep(sleep_time)
print
(
'开始获取'
)
headers
=
{
'Host'
:
's9-im-notify.csdn.net'
,
'Origin'
:
'http://blog.csdn.net'
,
'User-Agent'
: user_agent,
'Accept'
: r
'application/json, text/javascript, */*; q=0.01'
,
'Referer'
: r
'http://blog.csdn.net/u010620031/article/details/51068703'
,
}
proxy_support
=
request.ProxyHandler({
'http'
:proxy_ip})
opener
=
request.build_opener(proxy_support)
request.install_opener(opener)
req
=
request.Request(r
'http://blog.csdn.net/u010620031/article/details/51068703'
,headers
=
headers)
try
:
html
=
request.urlopen(req).read().decode(
'utf-8'
)
except
Exception as e:
print
(
'******打开失败!******'
)
else
:
global
count
count
+
=
1
print
(
'OK!总计成功%s次!'
%
count)
if
__name__
=
=
'__main__'
:
proxy_list
=
Get_proxy_ip()
for
i
in
range
(
100
):
Proxy_read(proxy_list, user_agent_list, i)
|
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持我! 。
原文链接:http://www.cnblogs.com/Lands-ljk/p/5673017.html 。
最后此篇关于通过Python爬虫代理IP快速增加博客阅读量的文章就讲到这里了,如果你想了解更多关于通过Python爬虫代理IP快速增加博客阅读量的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
给定的输入是192.168.3.78/27 输入可以是任意C类ip地址,以上ip为例进行尝试 预期输出应显示从 192.168.3.65 到 192.168.3.94 的所有 IP如下 192.168
您好,我是一名 javascript 菜鸟,正在为 IP 范围编写验证器。例如,1.1.1.1-2.2.2.2 是一个有效范围,但我想确保第一个 IP 不大于第二个 IP。 2.2.2.2-1.1.1
在 MySQL 数据库中存储多种 IP 类型的最佳方式是什么: - 单一 IP (123.123.123.123) - IP 范围 (123.123.123.1 - 123.123.123.121)
所以我有一个带有子网的 IP:8.8.8.0/24 我如何将其转换为 8.8.8.0 和 8.8.8.255(实际上是它们的 ip2long 结果) 在 PHP 和 JavaScript 中 最佳答案
我有 Windows7 作为我的基本操作系统。最重要的是,我在 Ubuntu 上安装了 Virtual Box。我希望 ubuntu 获得与我的基本操作系统(Win7)相同的 IP 地址。我如何实现这
关闭。这个问题是off-topic .它目前不接受答案。 想改善这个问题吗? Update the question所以它是 on-topic对于堆栈溢出。 9年前关闭。 Improve this q
阅读后List of IP Space used by Facebook : “真实”列表是最后一个答案,但我想知道 Igy(答案标记为解决方案)如何通过将连续的类添加到更大的类中来大幅缩小列表(通过
我正在开发一个 web 应用程序,我已经在我的本地主机中创建了这个项目,但是网络用户需要访问我的项目,我不想给他们一个不友好的 ip 地址,所以我想用户访问一个名称例子 http://myprojec
有人可以向我解释 Azure 在逻辑应用程序的出站 IP 地址之间不同的新方式之间的区别。 我认为文档在对该问题的正确解释方面非常精简。读起来听起来好像 IP 地址在逻辑应用程序中具有完全相同的作用。
我正在尝试熟悉一个项目中java中的数据报系统,目前,我们只使用UDP包。 为了发送消息,我们在 DatagramPacket 上设置目标 IP。 /* * The fields o
我有一个 Java 服务器,当我获得连接时,我需要检查 IP 是本地 IP 还是公共(public) IP。当它是我自己的本地 IP 时,我可以检测到它,但我在使用其他本地 IP 时遇到了一些问题。J
所以我在网上看到了很多例子,这些例子展示了如果你知道起始 IP 和结束 IP 如何获得完整的 IP,但我需要的是在提供后告诉我完整的 IP 范围带有起始 IP 和所需 IP 地址数的代码。 因此,例如
我创建了一个 python 项目,用于扫描 IP 范围(即 x.y.z.0/24)并返回在线主机列表。它将在线主机列表保存到仅包含 IP 的文件中(即 ['192.168.0.1'、'192.168.
如果用户的 ip 在某个 IP 范围之间,我正在使用重定向。但是,我正在使用多个 ip 范围,所以我想知道执行此操作的最佳方法。我目前正在使用它来重定向, 但是如果 IP 范围是 72.122.166
好的,现在是星期五下午,我度过了漫长的一周,希望能得到一些帮助!目前,我有一个 IP 范围列表,如下所示: List ipRanges = new List(); ipRanges.Add(new I
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 10 年前。 Improve thi
下面是我的 CloudFormation 模板的片段,用于将弹性 IP 地址与网络接口(interface)的主 IP 相关联: "MyInterfaceSelfEipAssociat
我在 Azure 上创建了 Python 函数,该函数调用外部 API 服务,该服务仅允许访问白名单 IP。 根据 Microsoft 文档 ( https://learn.microsoft.com
我在 Azure 上创建了 Python 函数,该函数调用外部 API 服务,该服务仅允许访问白名单 IP。 根据 Microsoft 文档 ( https://learn.microsoft.com
我在我的 CentOS 5 x86_64 中使用 IP 别名。为简化此示例:IP 地址 A 是 eth0 地址,IP 地址 B 是 eth0:0地址。我有 2 个 Apache 实例(版本 2.2.3
我是一名优秀的程序员,十分优秀!