Python3爬虫(四)--User Agent与代理IP的使用

为什么要使用User Agent

这个User Agent在系列文章第二篇中有简单的说过,今天详细说明一下

很多网站不喜欢被爬虫程序访问,所以会设置关卡阻止爬虫程序的访问,如过对方服务器检查到访问者是爬虫程序,也就是非人为点击访问的,就不会让你继续访问。此时通过设置User Agent来达到隐藏身份的目的,User Agent简称UA。

User Agent储存在headers中,服务器通过检测headers中的User Agent来判断是谁在访问,在python中如果不设置User Agent它会有默认的值,那么这个User Agent会带有python的字样,如果检测到User Agent是python就不会在让你继续访问。

常见的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这个库举例,设置User-Agent有两种方法,第一中在爬虫系列文章第二篇中有讲过这里不再赘述。
这里说一下第二种方法:

我们以百度首页为例,可以试一试不添加header,发现也能访问,但是访问此时过于频繁次数过多就会阻止你。这时候就需要添加header,直接copy一个上面列举的User-Agent

import urllib.request as res
url = "http://www.baidu.com"
req = res.Request(url)
req.add_header("User-Agent","Mozilla/5.0 (Windows NT 6.2; WOW64; rv:21.0) Gecko/20100101 Firefox/21.0")
response = res.urlopen(req)
html = response.read().decode('utf-8')
print(html)

运行结果就是将百度首页的源码全部抓下来了。

代理IP使用

有些网站就算你添加header,要知道我们程序运行速度是极其快的,如果使用同一个IP频繁的去爬取,就会被认定这不是人为操作,对方服务器会将你的IP封了,你就访问不了。所谓道高一尺魔高一丈,好的程序都是在不断改善中成长的,这时候我们就需要用到代理IP,就算封了我们的IP,我们可以换一个IP继续爬。

使用步骤:

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

2.创建Opener(类似于urlopen,这个代开方式是我们自己定制的)
urllib.request.build_opener([handler, …])

3.安装Opener
rllib.request.install_opener(opener)

详情查看官方文档

选取代理IP

在写代码前,需要在代理IP网站上选区 IP,推荐使用西刺代理IP。
URL:http://www.xicidaili.com/
随便选一个信号好点的,类型为HTTPS的IP 我选的 (112.85.169.252:9999),因为这是免费公开的代理IP所以肯定有很多人用,如果出现连接失败的情况,多尝试几个IP。我就尝试了差不多十个才成功。

编写代码访问 https://ip.cn/index.php 该网站是测试自己IP为多少的网址,服务器会返回访问者的IP。
我们可以先用浏览器打开这个网址查看我们自己的IP,这里可以看到我的ip是 61.xx.xx.111

然后将我们选好的IP,放到我们的代码中,然后用代码访问这个网站,看看返回的是不是我们代理的IP,
注意 proxy_port = res.ProxyHandler({'https':'112.85.169.252:9999'}) 这里要用https访问
代码如下:

import urllib.request as res
#访问的网址
url = "https://ip.cn/index.php"
#创建ProxyHandler
proxy_port = res.ProxyHandler({'https':'112.85.169.252:9999'})
#创建opener
opener = res.build_opener(proxy_port)
#添加User-Agent   这个添加User-Agent也可以在下面的urlopen中添加
opener.addheaders = [('User-Agent','Mozilla/5.0 (Windows NT 6.2; WOW64; rv:21.0) Gecko/20100101 Firefox/21.0')]
#安装User Angent
res.install_opener(opener)
#使用自己安装好的opener
response = res.urlopen(url)
html = response.read().decode('utf-8')
print(html)

看下结果:
可以看到返回的IP就是我们选的代理IP,这样就说明代理成功了。

我们还可以写一个IP列表,这样就不用我们经常手动更换IP
更改代码:

import urllib.request as res
import random
#访问的网址
url = "https://ip.cn/index.php"
#代理IP
proxy_list = [
    {'https':'112.85.171.133:9999'},
    {'https':'121.17.174.121:9797'},
    {'https':'114.217.229.53:8118'},
    {'https':'112.85.169.252:9999'}
]
# 从列表中随机选取一个IP
proxy = random.choice(proxy_list)
#查看随机出来的是那个IP
print(proxy)
#创建ProxyHandler
proxy_port = res.ProxyHandler(proxy)
#创建opener
opener = res.build_opener(proxy_port)
#添加User-Agent
opener.addheaders = [('User-Agent','Mozilla/5.0 (Windows NT 6.2; WOW64; rv:21.0) Gecko/20100101 Firefox/21.0')]
#安装User Angent
res.install_opener(opener)
#使用自己安装好的opener
response = res.urlopen(url)
html = response.read().decode('utf-8')
print(html)

这样就不用一直去ProxyHandler中更换IP了,每次运行就随机一个IP。以上就是User Agent与代理IP的使用基本方式了。

结语

但是就算这样如果我们列表中的IP全部都被封了怎么办呢?
这就需要我们使用代理池了,有免费的也有收费的,例如我们用的西刺就是免费,我们可以写一个爬虫将上面的IP都抓取下来做一个代理池,只要IP被封,自动去代理池找能用的IP,这样就更方便了。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值