专栏首页终身幼稚园Python使用Tor作为代理进行网页抓取

Python使用Tor作为代理进行网页抓取

前言


为什么要用代理

在网络抓取的过程中,我们经常会遇见很多网站采取了防爬取技术,或者说因为自己采集网站信息的强度和采集速度太大,给对方服务器带去了太多的压力,所以你一直用同一个代理IP爬取这个网页,很有可能IP会被禁止访问网页,所以基本上做爬虫的都躲不过去IP的问题,需要很多的IP来实现自己IP地址的不停切换,达到正常抓取信息的目的。

常用解决办法

使用ip代理池, 使用代理池的代理ip, 隐藏我们的实际ip, 从何起到绕过防爬技术的干扰。 这里顺便推荐一个githup开源项目https://github.com/jhao104/proxy_pool:该项目通过采集几个常用免费代理网站的代理ip, 构建自己的代理ip池。

今天我们讲方法不是使用ip代理池, 而是通过Tor(洋葱路由)进行匿名访问目标地址

介绍


什么是Tor(洋葱路由)

Tor(The Onion Router)是第二代洋葱路由(onion routing)的一种实现。 Tor专门防范流量过滤、嗅探分析,让用户免受其害。Tor在由“onion routers”(洋葱)组成的表层网(overlay network)上进行通信,可以实现匿名对外连接、匿名隐藏服务。

实现思路

  1. 运行tor
  2. 在Python中使用Tor作为selenium的代理
  3. 对一个目标网站发起请求
  4. 重复步骤2和3

实现代码

from stem import Signal
from stem.control import Controller
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from bs4 import BeautifulSoup

# 通过Tor切换ip
def switchIP():
  with Controller.from_port(port = 9051) as controller:
    controller.authenticate()
    controller.signal(Signal.NEWNYM)

# 获取代理的浏览器
def get_browser(PROXY = None):
  chrome_options = webdriver.ChromeOptions()
  if PROXY != None:
    chrome_options.add_argument('--proxy-server=SOCKS5://{0}'.format(PROXY)) # 代理
  chrome_options.add_argument('blink-settings=imagesEnabled=false') #不加载图片, 提升速度
  chrome_options.add_argument('--headless') #浏览器不提供可视化页面.
  executable_path='/Users/fewave/project/python/demo/chromedriver' #设置启动驱动
  return webdriver.Chrome(executable_path=executable_path, options=chrome_options)

def main():

  for x in range(5):
    switchIP()
    browser = get_browser('127.0.0.1:9050')
    browser.get('https://cip.cc')
    html = browser.page_source
    soup = BeautifulSoup(html, 'html.parser')
    print('======第%d次请求=======' % (x+1))
      print(soup.find_all('pre'))
    browser.quit()


if __name__ == '__main__':
  main()

准备工作

运行代码前, 还需做一下准备工作:

  1. 安装Tor, 因为我的本地电脑为mac, 因此直接通过brew安装 brew install tor, 安装完成后启动Tor服务, brew services start tor
  2. 下载浏览器驱动, 因为我本地使用的Chrome, 因此可到https://sites.google.com/a/chromium.org/chromedriver/downloads(需翻墙) 下载对应版本的驱动(驱动版本需与本机浏览器的版本对应)
  3. 下载python依赖, 可执行命令pip install selenium stem bs4
  4. 更新torrc文件并重新启动Tor,以便可以向Tor控制器发出请求。在mac上,您可以在/usr/local/etc/tor中找到torrc.sample文件。通过执行mv命令,将torrc.sample重命名为torrc
mv /usr/local/etc/tor/torrc.sample /usr/local/etc/tor/torrc

并且将torrc文件中的以下两行取消注释

ControlPort 9051
CookieAuthentication 1

重启Tor

brew services restart tor

代码介绍

# 通过Tor切换ip
def switchIP():
  with Controller.from_port(port = 9051) as controller:
    controller.authenticate()
    controller.signal(Signal.NEWNYM)

这个方法让我们切换IP。它向Tor控制器端口发出一个信号(Signal.NEWNYM),这告诉Tor我们需要一个新的电路来路由流量。这将给我们一个新的exit节点,这意味着我们的流量看起来像是来自另一个IP。

# 获取代理的浏览器
def get_browser(PROXY = None):
  chrome_options = webdriver.ChromeOptions()
  if PROXY != None:
    chrome_options.add_argument('--proxy-server=SOCKS5://{0}'.format(PROXY)) # 代理
  chrome_options.add_argument('blink-settings=imagesEnabled=false') #不加载图片, 提升速度
  chrome_options.add_argument('--headless') #浏览器不提供可视化页面.
  executable_path='/Users/fewave/project/python/demo/chromedriver' #设置启动驱动
  return webdriver.Chrome(executable_path=executable_path, options=chrome_options)

该方法将selenium webdriver设置为在无可数化模式下使用Chrome浏览器,并使用Tor作为代理路由我们的请求。这确保了所有对selenium webdriver的请求都经过Tor。

def main():
  print('开始程序')
  for x in range(5):
    switchIP()
    browser = get_browser('127.0.0.1:9050')
    browser.get('https://cip.cc')
    html = browser.page_source
    soup = BeautifulSoup(html, 'html.parser')
    print('======第%d次请求=======' % (x+1))
    print(soup.find_all('pre'))
    browser.quit()

最后这段代码只向https://cip.cc发送一个请求,这样我们就可以通过selenium webdriver检查请求的IP。打印出代理后的ip Stem 是基于 Tor 的 Python 控制器库,可以使用 Tor 的控制协议来对 Tor 进程进行脚本处理或者构建。

执行结果

======第1次请求=======
IP	: 23.129.64.187
地址	: 美国  华盛顿州  西雅图
运营商	: emeraldonion.org

数据二	: 美国

数据三	: 美国

URL	: http://www.cip.cc/23.129.64.187

======第2次请求=======
IP	: 109.70.100.20
地址	: 奥地利  奥地利

数据二	: 奥地利

数据三	: 奥地利

URL	: http://www.cip.cc/109.70.100.20

======第3次请求=======
IP	: 185.220.101.5
地址	: 荷兰  北荷兰省  阿姆斯特丹
运营商	: torservers.net

数据二	: 荷兰

数据三	: 德国

URL	: http://www.cip.cc/185.220.101.5

======第4次请求=======
IP	: 23.129.64.194
地址	: 美国  华盛顿州  西雅图
运营商	: emeraldonion.org

数据二	: 美国

数据三	: 美国

URL	: http://www.cip.cc/23.129.64.194

======第5次请求=======
IP	: 162.244.81.196
地址	: 美国  纽约州  纽约
运营商	: serverroom.net

数据二	: 美国

数据三	: 美国纽约纽约

URL	: http://www.cip.cc/162.244.81.196

很明显我们的真实ip已经被隐藏了

总结


上述代码通过启动浏览器驱动, 通过浏览器驱动代理Tor, 从而隐藏我们的真实ip。

不过驱动的启动比较慢, 频繁的驱动重启会让网页的爬取效率大打折扣。因此使用上述方法时, 应该尽量减少浏览器驱动的重启次数。

ps: Selenium: 自动化测试工具。它支持各种浏览器,包括 Chrome,Safari,Firefox 等主流界面式浏览器,如果你在这些浏览器里面安装一个 Selenium 的插件,那么便可以方便地实现Web界面的测试。换句话说叫 Selenium 支持这些浏览器驱动。

Beautiful Soup: 提供一些简单的、python式的函数用来处理导航、搜索、修改分析树等功能。它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简单,所以不需要多少代码就可以写出一个完整的应用程序。

Stem: 是基于 Tor 的 Python 控制器库,可以使用 Tor 的控制协议来对 Tor 进程进行脚本处理或者构建。

本文分享自微信公众号 - 终身幼稚园(kid-always),作者:园长

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-07-29

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • UML类图简单介绍

    一个项目初期,我们往往对业务一无所知,我们最急迫需要解决的问题就是理清楚这些业务概念以及它们的关系,如果能用好类图,你将能深入地剖析系统业务。

    终身幼稚园
  • 聊一聊Java枚举(enmu)的使用

    枚举可以被认为是一个密封类的语法糖,该类在编译时仅实例化了若干次,以定义一组常量。

    终身幼稚园
  • JAVA大数据导出EXCEL方案

    Java当中常用的Excel文档导出主要有POI、JXL和“直接IO流”这三种方式,三种方式各自分别有不同的优势与缺点,下面将分行对其进行简

    终身幼稚园
  • Mellanox真牛X,引无数英雄竞折腰!

    据媒体报道,英特尔已出价55亿美元竞购Mellanox Technologies。

    SDNLAB
  • 微软出高招了,聘请高盛洽谈收购Mellanox

    据以色列财经报纸《TheMarker》援引未透露姓名的市场消息人士称,微软已聘请高盛公司就收购Mellanox进行谈判。

    SDNLAB
  • "被逼"收购Mellanox,或许正是NVIDIA的最佳选择!

    作为以色列第二大的IT科技企业,Mellanox被收购的消息已经成为一种习惯之后,大家也不知道它到底要不要被收购,以及被最终会被谁收购。

    大数据在线
  • iOS中表视图(UITableView)使用详解

    - (instancetype)initWithFrame:(CGRect)frame style:(UITableViewStyle)style;  

    珲少
  • ASP.NET Core 使用UrlFirewall对请求进行过滤

    晓晨
  • 【CCF】门禁系统

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    喜欢ctrl的cxk
  • CSS中的background属性与margin和padding内外边距的关系总结

    background-image:定义背景图像。需要用 url('...') 引入图片。

    德顺

扫码关注云+社区

领取腾讯云代金券