在抓取一个网站的信息时,如果我们进行频繁的访问,就很有可能被网站检测到而被屏蔽,解决这个问题的方法就是使用ip代理 。在我们接入因特网进行上网时,我们的电脑都会被分配一个全球唯一地ip地址供我们使用,而当我们频繁访问一个网站时,网站也正是因为发现同一个ip地址访问多次而进行屏蔽的,所以这时候如果我们使用多个ip地址进行随机地轮流访问,这样被网站检测的概率就很小了,这时候如果我们再使用多个不同的headers,这时候就有多个ip+主机的组合,访问时被发现的概率又进一步减小了。

关于代码中ip代理的使用,下面介绍一下:

步骤:

1、urllib2库中的ProxyHandler类,通过此类可以使用ip代理访问网页

proxy_support=urllib2.ProxyHandler({}),其中参数是一个字典{‘类型':'代理ip:端口号'}

2、定制、创建一个opener

opener=urllib2.build_opener(proxy_support)

3、(1)安装opener

urlib2.install_opener(opener)

(2)调用默认的opener

opener.open(url)

对于没有设置反爬虫机制的网站,我们只需要直接像上面引入ProxyHandler类进行处理,下面以访问csdn主页为例:

  1. import urllib
  2. url="http://www.csdn.net/"
  3. for i in range(0,10000):
  4. html=urllib.urlopen(url)
  5. print html.info()
  6. print i

当使用上述代码时,当循环到20时,就会出现下面的错误

Traceback (most recent call last):
  File "C:/Users/lenovo/PycharmProjects/untitled1/jt2/__init__.py", line 19, in <module>
    html=urllib.urlopen(url)
  File "C:\Python27\lib\urllib.py", line 87, in urlopen
    return opener.open(url)
  File "C:\Python27\lib\urllib.py", line 213, in open
    return getattr(self, name)(url)
  File "C:\Python27\lib\urllib.py", line 350, in open_http
    h.endheaders(data)
  File "C:\Python27\lib\httplib.py", line 997, in endheaders
    self._send_output(message_body)
  File "C:\Python27\lib\httplib.py", line 850, in _send_output
    self.send(msg)
  File "C:\Python27\lib\httplib.py", line 812, in send
    self.connect()
  File "C:\Python27\lib\httplib.py", line 793, in connect
    self.timeout, self.source_address)
  File "C:\Python27\lib\socket.py", line 571, in create_connection
    raise err
IOError: [Errno socket error] [Errno 10060]

这就是因为我们使用了计算机的单一ip进行频繁访问而被检测出来的。

下面是使用了ip代理的代码:

  1. import urllib2
  2. import random
  3. def getHtml(url,proxies):
  4. random_proxy = random.choice(proxies)
  5. proxy_support = urllib2.ProxyHandler({"http":random_proxy})
  6. opener = urllib2.build_opener(proxy_support)
  7. urllib2.install_opener(opener)
  8. html=urllib2.urlopen(url)
  9. return html
  10. url="http://www.csdn.net/"
  11. proxies=["101.53.101.172:9999","171.117.93.229:8118","119.251.60.37:21387","58.246.194.70:8080"
  12. "115.173.218.224:9797","110.77.0.70:80"]
  13. for i in range(0,10000):
  14. try:
  15. html=getHtml(url,proxies)
  16. print html.info()     #打印网页的头部信息,只是为了展示访问到了网页,可以自己修改成想显示的内容
  17. print i
  18. except:
  19. print "出现故障"

这个代码我测试是在1096次时被检测到了,要知道我的列表中只有6个ip,如果我们增加ip的个数,那么被发现的概率是不是又会更低了。对于上面的例子中的ip代理,有可能在过了一段时间后便不能用了,这个需要自己到网上搜索最新的ip代理,进行替换。还有程序中的异常处理是为了使程序能够处理ip代码访问时出现问题的情况,因为有些ip代理在访问的时候会出现故障的,这样做了可以使程序更加健壮。

对于有反爬虫机制的网页,下面还是以访问csdn中的博客为例:

  1. #coding:utf-8
  2. import urllib2
  3. import random
  4. def get_html(url,headers,proxies):
  5. random_userAget = random.choice(headers)
  6. random_proxy = random.choice(proxies)
  7. #下面是模拟浏览器进行访问
  8. req = urllib2.Request(url)
  9. req.add_header("User-Agent", random_userAget)
  10. req.add_header("GET", url)
  11. req.add_header("Host", "blog.csdn.net")
  12. req.add_header("Referer", "http://blog.csdn.net/?&page=6")
  13. #下面是使用ip代理进行访问
  14. proxy_support = urllib2.ProxyHandler({"http":random_proxy})
  15. opener = urllib2.build_opener(proxy_support)
  16. urllib2.install_opener(opener)
  17. html = urllib2.urlopen(req)
  18. return html
  19. url = "http://blog.csdn.net/?&page=3"
  20. """
  21. 使用多个主机中的user_agent信息组成一个列表,当然这里面的user_agent都是残缺的,大家使用时可以自己找
  22. 身边的小伙伴借呦
  23. """
  24. user_agents = [
  25. "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWe。。。hrome/45.0.2454.101 Safari/537.36",
  26. "Mozilla / 5.0(Windows NT 6.1) AppleWebKit / 537.。。。。likeGecko) Chrome / 45.0.2454.101Safari/ 537.36",
  27. "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit。。。。。Gecko) Chrome/50.0.2661.102 Safari/537.36",
  28. "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.3。。。。ML, like Gecko) Chrome/49.0.2623.112 Safari/537.36",
  29. "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) 。。。WebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2486.0 Safari/537.36 Edge/13.10586",
  30. "User-Agent: Mozilla/5.0 (Windows NT 10.0) AppleWebKi。。。。。36 (KHTML, like Gecko) Chrome/46.0.2486.0 Safari/537.36 Edge/13.10586",
  31. "Mozilla/5.0 (Windows NT 10.0; WOW64) Apple。。。。。KHTML, like Gecko) Chrome/50.0.2661.94 Safari/537.36"
  32. ]
  33. #网上的ip有可能是不能用的,需要多做尝试
  34. myproxies=["220.189.249.80:80","124.248.32.43:80"]
  35. html = get_html(url,user_agents,myproxies)
  36. print html.read()

对于上面代码中的关于模拟浏览器的部分可以参照我的上一篇博客:http://blog.csdn.net/qq_29883591/article/details/52006624

python使用ip代理抓取网页的更多相关文章

  1. Python -- 网络编程 -- 简单抓取网页

    抓取网页: urllib.request.urlopen(url).read().decode('utf-8')  ---  (百度是utf-8,谷歌不是utf-8,也不是cp936,ascii也不行 ...

  2. python抓取数据,python使用socks代理抓取数据

    在python中,正常的抓取数据直接使用urllib2 这个模块: import urllib2 url = 'http://fanyi.baidu.com/' stream = urllib2.ur ...

  3. 利用Crowbar抓取网页异步加载的内容 [Python俱乐部]

    利用Crowbar抓取网页异步加载的内容 [Python俱乐部] 利用Crowbar抓取网页异步加载的内容 在做 Web 信息提取.数据挖掘的过程中,一个关键步骤就是网页源代码的获取.但是出于各种原因 ...

  4. python爬虫构建代理ip池抓取数据库的示例代码

    爬虫的小伙伴,肯定经常遇到ip被封的情况,而现在网络上的代理ip免费的已经很难找了,那么现在就用python的requests库从爬取代理ip,创建一个ip代理池,以备使用. 本代码包括ip的爬取,检 ...

  5. python分布式抓取网页

    呵呵,前两节好像和python没多大关系..这节完全是贴代码, 这是我第一次写python,很多地方比较乱,主要就看看逻辑流程吧. 对于编码格式确实搞得我头大..取下来页面不知道是什么编码,所以先找c ...

  6. python抓取网页过程

    准备过程 1.抓取网页的过程 准备好http请求(http request)->提交对应的请求->获得返回的响应(http response)->获得网页源码 2.GET还是POST ...

  7. Python 抓取网页并提取信息(程序详解)

    最近因项目需要用到python处理网页,因此学习相关知识.下面程序使用python抓取网页并提取信息,具体内容如下: #---------------------------------------- ...

  8. Python抓取网页中的图片到本地

    今天在网上找了个从网页中通过图片URL,抓取图片并保存到本地的例子: #!/usr/bin/env python # -*- coding:utf- -*- # Author: xixihuang # ...

  9. python抓取网页例子

    python抓取网页例子 最近在学习python,刚刚完成了一个网页抓取的例子,通过python抓取全世界所有的学校以及学院的数据,并存为xml文件.数据源是人人网. 因为刚学习python,写的代码 ...

随机推荐

  1. php mysql_db_query()函数使用介绍

    php mysql_db_query()函数选择一个数据库并在其上执行查询,本文章向大家介绍mysql_db_query()函数的基本使用方法和实例,需要的朋友可以参考一下本文章. mysql_db_ ...

  2. final修饰的类有什么特点

    变量定义为final,一旦被初始化便不可改变,这里不可改变的意思对基本类型来说是其值不可变,而对于对象变量来说其引用不可再变. 方法定义为final,是为了防止任何继承类改变它. 类定义为final, ...

  3. linux操作系统2 linux常用命令

    知识内容: 1.目录及文件操作 2.用户.群组与权限 3.重定向.管道 4.磁盘存储管理 5.系统命令 6.其他命令 参考: http://man.linuxde.net/ Linux命令规则:目录名 ...

  4. swagger配置

    1.pom.xml <!--swagger2--> <dependency> <groupId>io.springfox</groupId> <a ...

  5. msq_table's methods2

    -- 删除数据 自增长id被占用 -- 清楚所有数据并重置id 1 truncate table name; -- 主键(唯一) id int primary key; -- 主键内容不能重复,不能为 ...

  6. PHP闭包

    # 提到闭包就不得不想起匿名函数,也叫闭包函数(closures),貌似PHP闭包实现主要就是靠它.声明一个匿名函数是这样: $func = function() {       }; //带结束符 ...

  7. VBA 定义能返回数组公式的自定义函数

    返回一个变量大小结果数组的方法 此方法返回基于一个参数范围的值的数组.结果数组的大小具体取决于参数数组中的元素数量波动.例如对于假定您要创建一个范围中的每个值乘以 100 的函数.下面的自定义函数接受 ...

  8. vue基础——事件处理

    监听事件 可以用 v-on 指令监听dom事件,并在触发时运行一些JavaScript代码. 示例: <div id="example-1"> HTML <but ...

  9. python中带下划线的变量和函数的意义

    表示私有属性,只能在自己的实例方法里面访问. self.__name会被编译成self._Bar__name以达到“不被外部访问”的效果 示例如下: 变量: 1.  前带_的变量:  标明是一个私有变 ...

  10. 千万级高并发负载均衡软件haproxy配置文件详解

    balance roundrobin         #轮询方式 balance source               #将用户IP经过hash计算后,使同一IP地址的所有请求都发送到同一固定的后 ...