zoukankan      html  css  js  c++  java
  • Python 爬虫基础:使用代理 IP 和随机 UA 绕过反爬机制


    机灵鹤 2018-12-23 21:47:39 1608 收藏 8

    分类专栏: Python 爬虫开发常见问题 文章标签: Python Spider User-Agent IP

    版权

    本周事情比较多,又要赶项目,又要搞毕设,而且住的地方也远了,来回挺不方便的,所以......

    所以......其实上面的都是借口,真正的原因是,本周我受人委托,去爬一些 3D 模型的网站,但是这些网站的反爬机制实在强的可怕,账号登陆时有特别复杂的图形验证码(类似于12306的那种,让选哪张图中有小汽车,热水壶等类的问题,),下载链接也并不是网页中提供的那个,而是通过一系列复杂的 js 脚本函数计算出来的,实在是头都快大了,下周如果还搞不好的话,我就只好用 selenium 来爬了。

    不过事情虽然耽误了,但是每周一篇的爬虫文章还是要雷打不动的写的。想来想去,那就分享一下我挂代理 IP 和随机 UA 的方法吧。这些作为一个技术点,可以为爬虫“保驾护航”,一定程度上骗过服务器的反爬机制。

    写在前面的话

    本篇文章参考自(https://blog.csdn.net/qq_41782425/article/details/84993073),博主提出了一种在线获取代理 IP 的方法,可以保证获取到的代理 IP 均是最新的可用的,特别感谢。

    在爬取网站的时候,经常会遇到一个问题,就是很多网站上都部署了反爬虫机制,当服务器检测到一段时间内同一个 IP 持续密集的访问网站,则将其判定为爬虫程序,在一段时间内不允许该 IP 地址访问服务器。

    如果平时没什么事儿的话,可以写个延迟函数,每爬一次随机歇个几秒钟,这样可以很有效的降低访问密度,从而避开反爬机制。但是,这样的话太浪费时间了,几万条数据可能要爬一整天。有时候我们需要更加有效率的爬取数据,所以需要使用代理 IP 和随机 UA(User-Agent)。说白了就是伪装爬虫,假装不同的人使用不同的浏览器在访问网站。

    使用代理 IP

    之前我了解到的使用代理 IP 的方法,一般都是提前从一些免费的代理网站上爬取免费代理,存在本地或者数据库中,使用的时候再进行读取。

    但是这样做有个小问题就是,免费的代理 IP 存活时间都特别短暂,从几十秒到几十分钟不等,我之前整过几次,每次爬完 IP 之后,到用的时候,已经有一半左右的IP已经失效了。感觉不是特别好用,就没在搞了。

    后来看到这位大佬的思路之后,我才重新发现了使用代理 IP 的强大之处。它在爬虫运行的同时,在线获取代理 IP。每次只获取一页,存于数组中,随机使用。当大部分的 IP 失效之后(记录访问失败的次数,当超过一定阈值时,则视为此页代理 IP 失效),然后重新获取一页代理 IP,如此,可保证每次使用的都是最新的 IP,而且不需要额外的空间和文件来存放代理 IP。

    1. def get_proxy(page):

    2. '''

    3. 功能:获取 快代理 网站上的最新免费代理IP

    4. 参数: page 页数

    5. 返回:存有代理 IP 的列表 proxyList

    6. '''

    7. # 存放获取到的代理 IP 信息

    8. proxyList = []

    9. # 访问 快代理 网站,获取第 page 页的网页信息

    10. headers = {

    11. "User-Agent" : "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"

    12. }

    13. request = urllib.request.Request("https://www.kuaidaili.com/free/inha/"+str(page), headers=headers)

    14. html = urllib.request.urlopen(request).read()

    15. # 解析网页信息,从中提取代理 ip 的数据

    16. content = etree.HTML(html)

    17. ip = content.xpath('//td[@data-title="IP"]/text()')

    18. port = content.xpath('//td[@data-title="PORT"]/text()')

    19. # 将代理 ip 信息存入 proxyList 列表

    20. for i in ip:

    21. for p in port:

    22. proxyList.append(i+':'+p)

    23. return proxyList

    使用随机 UA

    UA,即 User-Agent ,使用它可以将我们的爬虫伪装成浏览器,让对方以为是真人在使用浏览器访问,从而骗过目标网站的反爬机制。但是使用固定的 UA 去爬也是会有问题的,你想嘛,假如你发现最近几个小时内来访问的几万个用户,用的都是同一个浏览器,你还会认为对面是真人吗?不封它封谁!

    所以,为了让我们的爬虫更像真人在使用,我们不仅要为它设置 UA,还要使用随机 UA(让对方服务器开心的以为有好多的用户在访问呢)。

    这是 UA 列表,截取了部分,这个在网上随便一找就能找到好多。

    1. USER_AGENTS = [

    2. 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36 OPR/26.0.1656.60',

    3. 'Opera/8.0 (Windows NT 5.1; U; en)',

    4. 'Mozilla/5.0 (Windows NT 5.1; U; en; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 Opera 9.50',

    5. 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en) Opera 9.50',

    6. 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0',

    7. 'Mozilla/5.0 (X11; U; Linux x86_64; zh-CN; rv:1.9.2.10) Gecko/20100922 Ubuntu/10.10 (maverick) Firefox/3.6.10',

    8. 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.57.2 (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2',

    9. 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36',

    10. 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11',

    11. 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.133 Safari/534.16',

    12. 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.11 TaoBrowser/2.0 Safari/536.11',

    13. 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.71 Safari/537.1 LBBROWSER',

    14. 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; LBBROWSER)',

    15. 'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.84 Safari/535.11 SE 2.X MetaSr 1.0',

    16. 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; SV1; QQDownload 732; .NET4.0C; .NET4.0E; SE 2.X MetaSr 1.0)',

    17. 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 UBrowser/4.0.3214.0 Safari/537.36'

    18. ]

    使用的时候,直接使用随机函数 random.choice() 来从列表中选择选择一个。

    使用方法可以参考以下代码:

    1. user_agent = random.choice(USER_AGENTS)

    2. proxy = random.choice(proxyList)

    3. url = 'https://blog.csdn.net/wenxuhonghe/article/details/85036674'

    4. headers = {

    5. "Connection": "keep-alive",

    6. "Cache-Control": "max-age=0",

    7. "Upgrade-Insecure-Requests": "1",

    8. "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8",

    9. "Accept-Language": "zh-CN,zh;q=0.9",

    10. "Cookie": ""

    11. }

    12. try:

    13. # 构建一个Handler处理器对象,参数是一个字典类型,包括代理类型和代理服务器IP+PROT

    14. httpproxy_handler = urllib.request.ProxyHandler({"http": proxy})

    15. opener = urllib.request.build_opener(httpproxy_handler)

    16. urllib.request.install_opener(opener)

    17. request = urllib.request.Request(url,headers=headers)

    18. request.add_header("User-Agent", user_agent)

    19. response = urllib.request.urlopen(request)

    20. html = response.read()

    21. # 解析目标页面,提取相关信息

    22. parse_data(html)

    23. time.sleep(1)

    24. except Exception as result:

    25. print ("错误信息:%s"%(result))

    写在后面的话

    上面介绍了如何使用代理 ip 和 随机 ua 来避开网站的反爬虫机制,实现高效率的数据爬取。

    本文中使用的方法亲测可用,但是代码并非全部源码,不保证代码可以直接复制粘贴使用,建议大家理解原理之后,根据自己的爬虫项目需要进行相应的调整。

    如果文章中有哪里没有讲明白,或者讲解有误的地方,欢迎在评论区批评指正,或者扫描下面的二维码,加我微信,大家一起学习交流,共同进步。

  • 相关阅读:
    Ajax中onreadystatechange函数不执行,是因为放在open()后
    js调用ajax案例2,使用ok
    js调用ajax案例
    通过设置ie的通过跨域访问数据源,来访问本地服务
    Net 4.5 WebSocket 在 Windows 7, Windows 8 and Server 2012上的比较以及问题
    Net 4.5 WebSocket 在 Windows 7, Windows 8 and Server 2012上的比较
    windows 系统纯净版官网下载地址
    iOS:给Git仓库上传代码时,超过100M会被拒绝(例如github和oschina)
    iOS:Xcode8以下真机测试iOS10.0和iOS10.1配置包
    iOS:高德地图的使用
  • 原文地址:https://www.cnblogs.com/cute/p/13686484.html
Copyright © 2011-2022 走看看