Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Python使用Tor作为代理进行网页抓取

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

作者头像
终身幼稚园
发布于 2020-05-18 10:09:58
发布于 2020-05-18 10:09:58
7.3K00
代码可运行
举报
文章被收录于专栏:终身幼稚园终身幼稚园
运行总次数:0
代码可运行

前言


为什么要用代理

在网络抓取的过程中,我们经常会遇见很多网站采取了防爬取技术,或者说因为自己采集网站信息的强度和采集速度太大,给对方服务器带去了太多的压力,所以你一直用同一个代理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

实现代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mv /usr/local/etc/tor/torrc.sample /usr/local/etc/tor/torrc

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ControlPort 9051
CookieAuthentication 1

重启Tor

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
brew services restart tor

代码介绍

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 通过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。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 获取代理的浏览器
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。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 进程进行脚本处理或者构建。

执行结果

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
======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 进程进行脚本处理或者构建。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-07-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 终身幼稚园 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
[1296]selenium配置带用户名和密码的隧道代理
参考:https://blog.csdn.net/crayonjingjing/article/details/137596882 https://segmentfault.com/q/1010000043258582
周小董
2024/11/24
2510
网页抓取进阶:如何提取复杂网页信息
在信息爆炸的时代,数据无处不在,尤其是各大平台上的评论、评分、商家信息等宝贵资源。对于开发者、数据分析师和商业研究者而言,如何从复杂的网页中高效抓取这些数据变得尤为重要。网页抓取(Web Scraping)作为一种自动化获取数据的技术,已经成为从网站获取大量信息的最佳选择。然而,随着网页结构的复杂化(例如动态加载、反爬机制),传统的抓取方式可能难以应对。
jackcode
2024/09/23
5740
网页抓取进阶:如何提取复杂网页信息
Python + Selenium + Chrome 使用代理 auth 的用户名密码授权
米扑代理,全球领导的代理品牌,专注代理行业近十年,提供开放、私密、独享代理,并可免费试用
阳光岛主
2019/02/18
3K0
Python + Selenium + Chrome 使用代理 auth 的用户名密码授权
深入剖析 Python 爬虫:淘宝商品详情数据抓取
淘宝平台的商品详情页包含了丰富的信息,如商品名称、价格、销量、评价、参数等。这些数据对于市场调研、数据分析、产品定价等商业决策具有极高的价值。然而,淘宝的反爬虫机制非常强大,直接使用简单的 HTTP 请求往往无法获取完整数据。因此,我们需要借助 Selenium 模拟浏览器行为,并通过代理服务器来隐藏爬虫的真实身份。
小白学大数据
2025/02/18
1380
深入剖析 Python 爬虫:淘宝商品详情数据抓取
如何使用Python爬虫处理JavaScript动态加载的内容?
JavaScript已经成为构建动态网页内容的关键技术。这种动态性为用户带来了丰富的交互体验,但同时也给爬虫开发者带来了挑战。传统的基于静态内容的爬虫技术往往无法直接获取这些动态加载的数据。本文将探讨如何使用Python来处理JavaScript动态加载的内容,并提供详细的实现代码过程。
小白学大数据
2024/10/11
9310
如何优化 Selenium 和 BeautifulSoup 的集成以提高数据抓取的效率?
摘要 在互联网时代,数据的价值日益凸显。对于电商网站如京东,其商品信息、用户评价等数据对于市场分析、产品定位等具有重要意义。然而,由于这些网站通常使用 JavaScript 动态生成内容,传统的爬虫技术难以直接获取到完整数据。本文将以爬取京东商品信息为例,探讨如何优化 Selenium 和 BeautifulSoup 的集成,以提高数据抓取的效率。
小白学大数据
2024/07/24
2430
selenium使用之安装webdriver
使用pycharm的可以在settings-> interceptor中进行安装。
山行AI
2019/09/19
4.4K0
selenium使用之安装webdriver
Selenium 如何使用代理 IP 进行 Web 爬虫(无认证实现、有账号密码认证实现)
👋 你好,我是 Lorin 洛林,一位 Java 后端技术开发者!座右铭:Technology has the power to make the world a better place.
Lorin 洛林
2024/01/02
4.4K0
Selenium 如何使用代理 IP 进行 Web 爬虫(无认证实现、有账号密码认证实现)
深入剖析 Python 爬虫:淘宝商品详情数据抓取
淘宝平台的商品详情页包含了丰富的信息,如商品名称、价格、销量、评价、参数等。这些数据对于市场调研、数据分析、产品定价等商业决策具有极高的价值。然而,淘宝的反爬虫机制非常强大,直接使用简单的 HTTP 请求往往无法获取完整数据。因此,我们需要借助 Selenium 模拟浏览器行为,并通过代理服务器来隐藏爬虫的真实身份。
小白学大数据
2025/02/17
1451
Selenium 简单介绍、安装、启动
Selenium简单介绍 https://selenium-python.readthedocs.io/ https://python-selenium-zh.readthedocs.io/zh_CN/latest/ 什么是selenium 通过浏览器驱动来自动化操纵浏览器的工具 selenium -> 传输指令 -> webdriver -> 转换指令 -> 浏览器 webdriver的出现是为了兼容各语言各版本, 使java或者python都可以通过同一个webdriver达到操纵浏览器的目的. se
友儿
2022/10/05
3750
Python爬虫教程:Selenium可视化爬虫的快速入门
Selenium最初是为自动化Web应用程序的测试而设计的。它支持多种编程语言,并能与主流的浏览器进行交互。使用Selenium,我们可以模拟用户在浏览器中的各种行为,如点击、滚动、输入等,这使得它成为开发可视化爬虫的理想选择。
小白学大数据
2024/10/18
2800
Python爬虫教程:Selenium可视化爬虫的快速入门
网络爬虫作为获取数据的一种手段,其重要性日益凸显。Python语言以其简洁明了的语法和强大的库支持,成为编写爬虫的首选语言之一。Selenium是一个用于Web应用程序测试的工具,它能够模拟用户在浏览器中的操作,非常适合用来开发可视化爬虫。本文将带你快速入门Python Selenium可视化爬虫的开发。
小白学大数据
2024/10/17
3830
Python 实现如何电商网站滚动翻页爬取
电商网站如亚马逊和淘宝为了提升用户体验,通常采用滚动翻页加载数据的方式。当用户滚动页面到底部时,会触发新的数据加载,而不是一次性将所有数据展示在页面上。这种机制虽然对用户友好,但对爬虫来说却增加了爬取难度。
小白学大数据
2025/04/11
1380
利用无头浏览器爬取JavaScript生成的网页
在进行网页爬取时,经常会遇到 JavaScript 生成的网页。由于 JavaScript 的动态渲染特性,传统的爬虫工具往往无法获取完整的页面内容。这时就需要使用无头浏览器来爬取JavaScript生成的网页,以获取所需的数据。
小白学大数据
2023/09/07
7760
Python 实现如何电商网站滚动翻页爬取
电商网站如亚马逊和淘宝为了提升用户体验,通常采用滚动翻页加载数据的方式。当用户滚动页面到底部时,会触发新的数据加载,而不是一次性将所有数据展示在页面上。这种机制虽然对用户友好,但对爬虫来说却增加了爬取难度。
小白学大数据
2025/04/10
1100
selenium设置proxy、headers(phantomjs、Chrome、Firefox)
文章参考:https://www.zhihu.com/question/35547395
周小董
2019/03/25
4.7K0
火狐谷歌模拟一个虚拟界面
在Python中进行浏览器测试时,一般我们会选择selenium这样的库来简化我们工作量。而有些时候,为了对一些动态数据进行抓取,我们会选择
周小董
2019/03/25
9690
火狐谷歌模拟一个虚拟界面
基于Selenium写的Python天气爬虫
天气如此炎热! 写个爬虫降降温??? 看完天气预报,嗯瞬间感觉热了好多! 学习还是要继续! 昨天没有说明XPath 今天现给补充点常用规则 XPath常用规则 表达式 描述 nodename 选取
萌海无涯
2019/08/03
7020
WebDriver与Chrome DevTools Protocol:如何在浏览器自动化中提升效率
随着互联网数据的爆炸式增长,爬虫技术成为了获取信息的重要工具。在实际应用中,如何提升浏览器自动化的效率是开发者常常面临的挑战。Chrome DevTools Protocol(CDP)与Selenium WebDriver相结合,为浏览器自动化提供了强大的控制能力,并允许用户直接与浏览器的底层交互。本文将通过使用CDP优化Selenium的效率,结合代理IP技术,实现对微博数据的高效采集,并通过设置cookie和user-agent模拟真实用户行为。
jackcode
2024/09/05
4260
WebDriver与Chrome DevTools Protocol:如何在浏览器自动化中提升效率
Python selenium webdriver 基本使用
本文就介绍了Selenium的常用内容:了解Selenium Webdriver 是干什么的
EXI-小洲
2022/12/13
1.7K0
推荐阅读
相关推荐
[1296]selenium配置带用户名和密码的隧道代理
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档