Python3网络爬虫之使用User Agent和代理IP隐藏身份


Posted in Python onNovember 23, 2017

本文介绍了Python3网络爬虫之使用User Agent和代理IP隐藏身份,分享给大家,具体如下:

  1. 运行平台:Windows
  2. Python版本:Python3.x
  3. IDE:Sublime text3

一、为何要设置User Agent

有一些网站不喜欢被爬虫程序访问,所以会检测连接对象,如果是爬虫程序,也就是非人点击访问,它就会不让你继续访问,所以为了要让程序可以正常运行,需要隐藏自己的爬虫程序的身份。此时,我们就可以通过设置User Agent的来达到隐藏身份的目的,User Agent的中文名为用户代理,简称UA。

User Agent存放于Headers中,服务器就是通过查看Headers中的User Agent来判断是谁在访问。在Python中,如果不设置User Agent,程序将使用默认的参数,那么这个User Agent就会有Python的字样,如果服务器检查User Agent,那么没有设置User Agent的Python程序将无法正常访问网站。

Python允许我们修改这个User Agent来模拟浏览器访问,它的强大毋庸置疑。

二、常见的User Agent

1.Android

  1. Mozilla/5.0 (Linux; Android 4.1.1; Nexus 7 Build/JRO03D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19
  2. Mozilla/5.0 (Linux; U; Android 4.0.4; en-gb; GT-I9300 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30
  3. Mozilla/5.0 (Linux; U; Android 2.2; en-gb; GT-P1000 Build/FROYO) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1

2.Firefox

  1. Mozilla/5.0 (Windows NT 6.2; WOW64; rv:21.0) Gecko/20100101 Firefox/21.0
  2. Mozilla/5.0 (Android; Mobile; rv:14.0) Gecko/14.0 Firefox/14.0

3.Google Chrome

  1. Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.94 Safari/537.36
  2. Mozilla/5.0 (Linux; Android 4.0.4; Galaxy Nexus Build/IMM76B) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.133 Mobile Safari/535.19

4.iOS

  1. Mozilla/5.0 (iPad; CPU OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A334 Safari/7534.48.3
  2. Mozilla/5.0 (iPod; U; CPU like Mac OS X; en) AppleWebKit/420.1 (KHTML, like Gecko) Version/3.0 Mobile/3A101a Safari/419.3

上面列举了Andriod、Firefox、Google Chrome、iOS的一些User Agent,直接copy就能用。

三、设置User Agent的方法

先看下urllib.request.Request()

Python3网络爬虫之使用User Agent和代理IP隐藏身份

从上图可以看出,在创建Request对象的时候,可以传入headers参数。 

因此,想要设置User Agent,有两种方法:

1.在创建Request对象的时候,填入headers参数(包含User Agent信息),这个Headers参数要求为字典;

2.在创建Request对象的时候不添加headers参数,在创建完成之后,使用add_header()的方法,添加headers。

方法一:

创建文件urllib_test09.py,使用上面提到的Android的第一个User Agent,在创建Request对象的时候传入headers参数,编写代码如下:

# -*- coding: UTF-8 -*-
from urllib import request

if __name__ == "__main__":
  #以CSDN为例,CSDN不更改User Agent是无法访问的
  url = 'http://www.csdn.net/'
  head = {}
  #写入User Agent信息
  head['User-Agent'] = 'Mozilla/5.0 (Linux; Android 4.1.1; Nexus 7 Build/JRO03D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19'
 #创建Request对象
  req = request.Request(url, headers=head)
  #传入创建好的Request对象
  response = request.urlopen(req)
  #读取响应信息并解码
  html = response.read().decode('utf-8')
  #打印信息
  print(html)

运行结果如下:

Python3网络爬虫之使用User Agent和代理IP隐藏身份

方法二:

创建文件urllib_test10.py,使用上面提到的Android的第一个User Agent,在创建Request对象时不传入headers参数,创建之后使用add_header()方法,添加headers,编写代码如下:

# -*- coding: UTF-8 -*-
from urllib import request

if __name__ == "__main__":
  #以CSDN为例,CSDN不更改User Agent是无法访问的
  url = 'http://www.csdn.net/'
  #创建Request对象
  req = request.Request(url)
  #传入headers
  req.add_header('User-Agent', 'Mozilla/5.0 (Linux; Android 4.1.1; Nexus 7 Build/JRO03D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19')
  #传入创建好的Request对象
  response = request.urlopen(req)
  #读取响应信息并解码
  html = response.read().decode('utf-8')
  #打印信息
  print(html)

运行结果和上一个方法是一样的。

四、IP代理的使用

1.为何使用IP代理

User Agent已经设置好了,但是还应该考虑一个问题,程序的运行速度是很快的,如果我们利用一个爬虫程序在网站爬取东西,一个固定IP的访问频率就会很高,这不符合人为操作的标准,因为人操作不可能在几ms内,进行如此频繁的访问。所以一些网站会设置一个IP访问频率的阈值,如果一个IP访问频率超过这个阈值,说明这个不是人在访问,而是一个爬虫程序。

2.一般步骤说明

一个很简单的解决办法就是设置延时,但是这显然不符合爬虫快速爬取信息的目的,所以另一种更好的方法就是使用IP代理。使用代理的步骤:

 (1)调用urlib.request.ProxyHandler(),proxies参数为一个字典。

Python3网络爬虫之使用User Agent和代理IP隐藏身份

(2)创建Opener(类似于urlopen,这个代开方式是我们自己定制的)

Python3网络爬虫之使用User Agent和代理IP隐藏身份

(3)安装Opener

 Python3网络爬虫之使用User Agent和代理IP隐藏身份

使用install_opener方法之后,会将程序默认的urlopen方法替换掉。也就是说,如果使用install_opener之后,在该文件中,再次调用urlopen会使用自己创建好的opener。如果不想替换掉,只是想临时使用一下,可以使用opener.open(url),这样就不会对程序默认的urlopen有影响。

3.代理IP选取

在写代码之前,先在代理IP网站选好一个IP地址,推荐西刺代理IP。

URL:http://www.xicidaili.com/

注意:当然也可以写个正则表达式从网站直接爬取IP,但是要记住不要太频繁爬取,加个延时什么的,太频繁给服务器带来压力了,服务器会直接把你block,不让你访问的,我就被封了两天。

从西刺网站选出信号好的IP,我的选择如下:(106.46.136.112:808)

Python3网络爬虫之使用User Agent和代理IP隐藏身份

编写代码访问http://www.whatismyip.com.tw/,该网站是测试自己IP为多少的网址,服务器会返回访问者的IP。

4.代码实例

创建文件urllib_test11.py,编写代码如下:

# -*- coding: UTF-8 -*-
from urllib import request

if __name__ == "__main__":
  #访问网址
  url = 'http://www.whatismyip.com.tw/'
  #这是代理IP
  proxy = {'http':'106.46.136.112:808'}
  #创建ProxyHandler
  proxy_support = request.ProxyHandler(proxy)
  #创建Opener
  opener = request.build_opener(proxy_support)
  #添加User Angent
  opener.addheaders = [('User-Agent','Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36')]
  #安装OPener
  request.install_opener(opener)
  #使用自己安装好的Opener
  response = request.urlopen(url)
  #读取相应信息并解码
  html = response.read().decode("utf-8")
  #打印信息
  print(html)

运行结果如下:

Python3网络爬虫之使用User Agent和代理IP隐藏身份

从上图可以看出,访问的IP已经伪装成了106.46.136.112。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python SQLAlchemy基本操作和常用技巧(包含大量实例,非常好)
May 06 Python
python中常用的各种数据库操作模块和连接实例
May 29 Python
Python常用模块介绍
Nov 21 Python
用Python编写一个简单的Lisp解释器的教程
Apr 03 Python
详解Python中类的定义与使用
Apr 11 Python
Python基于identicon库创建类似Github上用的头像功能
Sep 25 Python
Pandas 合并多个Dataframe(merge,concat)的方法
Jun 08 Python
python读取文本中的坐标方法
Oct 14 Python
Python发送手机动态验证码代码实例
Feb 28 Python
Python小整数对象池和字符串intern实例解析
Mar 21 Python
python pip如何手动安装二进制包
Sep 30 Python
python实现三次密码验证的示例
Apr 29 Python
python网络爬虫之如何伪装逃过反爬虫程序的方法
Nov 23 #Python
Python实现的基数排序算法原理与用法实例分析
Nov 23 #Python
Scrapy抓取京东商品、豆瓣电影及代码分享
Nov 23 #Python
python简单图片操作:打开\显示\保存图像方法介绍
Nov 23 #Python
python分析作业提交情况
Nov 22 #Python
Python分析学校四六级过关情况
Nov 22 #Python
linux环境下的python安装过程图解(含setuptools)
Nov 22 #Python
You might like
解析PHP强制转换类型及远程管理插件的安全隐患
2014/06/30 PHP
Laravel 5框架学习之Eloquent 关系
2015/04/09 PHP
在视频前插入广告
2006/11/20 Javascript
js 事件小结 表格区别
2007/08/13 Javascript
ASP.NET jQuery 实例3 (在TextBox里面阻止复制、剪切和粘贴事件)
2012/01/13 Javascript
js单向链表的具体实现实例
2013/06/21 Javascript
JS 两日期相减,获得天数的小例子(兼容IE,FF)
2013/07/01 Javascript
javaScript面向对象继承方法经典实现
2013/08/20 Javascript
jQuery实现列表自动滚动循环滚动展示新闻
2014/08/22 Javascript
escape函数解决js中ajax传递中文出现乱码问题
2014/10/30 Javascript
javascript中使用new与不使用实例化对象的区别
2015/06/22 Javascript
jQuery实用技巧必备(中)
2015/11/03 Javascript
AngularJS学习笔记(三)数据双向绑定的简单实例
2016/11/08 Javascript
javaScript产生随机数的用法小结
2018/04/21 Javascript
浅析java线程中断的办法
2018/07/29 Javascript
教你完全理解ReentrantLock重入锁
2019/06/03 Javascript
Node.js 实现简单的无侵入式缓存框架的方法
2019/07/21 Javascript
js简单粗暴的发布订阅示例代码
2021/01/23 Javascript
[52:02]完美世界DOTA2联赛PWL S2 FTD.C vs SZ 第一场 11.27
2020/11/30 DOTA
按日期打印Python的Tornado框架中的日志的方法
2015/05/02 Python
python抓取最新博客内容并生成Rss
2015/05/17 Python
使用Turtle画正螺旋线的方法
2017/09/22 Python
Python2和Python3中print的用法示例总结
2017/10/25 Python
Python中类的创建和实例化操作示例
2019/02/27 Python
python requests更换代理适用于IP频率限制的方法
2019/08/21 Python
pytorch之inception_v3的实现案例
2020/01/06 Python
使用css3做0.5px的细线的示例代码
2018/01/18 HTML / CSS
HTML5自定义data-* data(obj)属性和jquery的data()方法的使用
2012/12/13 HTML / CSS
美国健康和保健平台:healtop
2020/07/02 全球购物
医药工作岗位求职信分享
2013/12/31 职场文书
社区党员先进事迹
2014/01/22 职场文书
团代会闭幕词
2015/01/28 职场文书
防卫过当辩护词
2015/05/21 职场文书
爱国电影观后感
2015/06/19 职场文书
中秋节随笔
2015/08/15 职场文书
css3中2D转换之有趣的transform形变效果
2022/02/24 HTML / CSS