首页 > 编程问答 >使用 Tor + Privoxy 抓取谷歌购物结果:如何避免被阻止?

使用 Tor + Privoxy 抓取谷歌购物结果:如何避免被阻止?

时间:2024-07-26 04:01:31浏览次数:7  
标签:python web-scraping tor

我已经在我的服务器上安装了 Tor + Privoxy 并且它们工作正常! (已测试)。 但现在当我尝试使用 urllib2 (python) 抓取谷歌购物结果时,当然使用代理,我总是被谷歌阻止(有时是 503 错误,有时是 403 错误)。那么任何人有任何解决方案可以帮助我避免这个问题吗?非常感谢!!

我正在使用的源代码:

 _HEADERS = {
      'User-Agent': 'Mozilla/5.0',
      'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
      'Accept-Encoding': 'deflate',
      'Connection': 'close',
      'DNT': '1'
  }

  request = urllib2.Request("https://www.google.com/#q=iphone+5&tbm=shop", headers=self._HEADERS)

  proxy_support = urllib2.ProxyHandler({"http" : "127.0.0.1:8118"})
  opener = urllib2.build_opener(proxy_support) 
  urllib2.install_opener(opener)

  try:
      response = urllib2.urlopen(request)
      html = response.read()
      print html

   except urllib2.HTTPError as e:
       print e.code
       print e.reason


注意:当我不使用代理时,它可以正常工作!


遇到的问题是 Google 会积极阻止似乎来自 Tor 出口节点的请求。这是因为他们希望防止抓取并滥用其搜索结果,并且 Tor 通常用于隐藏用户的身份和位置。

以下是一些避免在使用 Tor 和 Privoxy 抓取 Google 购物结果时被阻止的提示:

1. 轮换的 IP 地址:

  • 使用 Tor 的内置功能来更改的 IP 地址。 Tor 提供了更改电路的功能,这将为提供一个新的 IP 地址。可以使用 tor 命令行工具或 Stem(一个用于控制 Tor 的 Python 库)来执行此操作。 ```python from stem import Signal from stem.control import Controller

with Controller.from_port(9051) as controller: controller.authenticate() controller.signal(Signal.NEWNYM) ``` * 使用住宅代理。 与数据中心 IP 相比,住宅代理提供真实住宅用户的 IP 地址,使其更难以被检测到和阻止。可以找到提供轮换 IP 的住宅代理服务。

2. 模拟真实用户的行为:

  • 降低抓取速度。 快速连续发出多个请求是是机器人的一个明显信号。在请求之间设置随机延迟以模拟人类行为。 ```python import time import random

time.sleep(random.uniform(2, 5)) # 延迟 2 到 5 秒 ``` * 使用不同的搜索词。 不要总是使用相同的查询。尝试改变的搜索词,使用不同的过滤器和排序选项。 * 设置随机化的用户代理。 定期更改的用户代理字符串,以模仿不同的浏览器和操作系统。可以找到可用于 Python 的用户代理字符串列表。 * 使用 Headless 浏览器。 像 PhantomJS 或 Headless Chrome 这样的 Headless 浏览器可以执行 JavaScript 并渲染网站,使其看起来更像真实用户的请求。

3. 考虑替代解决方案:

  • 使用 Google Shopping API。 如果需要定期抓取大量数据,Google Shopping API 是一个更可靠和可扩展的解决方案。但是,它确实需要一个 API 密钥并且有使用限制。
  • 使用专门的抓取服务。 有许多第三方服务专门用于抓取网站,包括 Google 购物。这些服务通常处理 IP 轮换、验证码和反抓取措施。

代码改进:

的代码看起来不错,但可以通过添加随机用户代理轮换和请求之间的随机延迟来改进它。

import urllib2
import time
import random

_HEADERS = {
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    'Accept-Encoding': 'deflate',
    'Connection': 'close',
    'DNT': '1'
}

def random_user_agent():
    user_agents = [
        'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36',
        'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36',
        'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'
    ]
    return {'User-Agent': random.choice(user_agents)}

def get_html(url):
    time.sleep(random.uniform(2, 5))
    request = urllib2.Request(url, headers=random_user_agent())
    proxy_support = urllib2.ProxyHandler({"http": "127.0.0.1:8118"})
    opener = urllib2.build_opener(proxy_support)
    urllib2.install_opener(opener)
    try:
        response = urllib2.urlopen(request)
        return response.read()
    except urllib2.HTTPError as e:
        print(e.code)
        print(e.reason)
        return None

if __name__ == '__main__':
    html = get_html("https://www.google.com/#q=iphone+5&tbm=shop")
    if html:
        print(html)

请记住: 抓取网站的服务条款可能各不相同。在抓取任何网站之前,请务必查看其 robots.txt 文件和服务条款,以确保没有违反任何规则。

标签:python,web-scraping,tor
From: 19464427

相关文章

  • 如何在python3中找到文件的长度?
    我的第一个.py:defcreate_file(file_name):list=["ab","cd","ef"]foriinlist:withopen(file_name,"a+")asinput_file:print("{}".format(i),file=input_file)我的第二个.py:fromfirstimport......
  • 哪种 python 日志记录风格是推荐的或标准的?
    我是Python新手。介于以下2个选项之间。对于python来说,推荐哪种风格或者更好?logging.info(f"Won'tsavemodelasscoreisbelow0,score:{score}")logging.info("Won'tsavemodelasscoreisbelow0,score%s",score)我个人更喜欢第二种方法。在Python......
  • python 协程 自定义互斥锁
    最近在用python的一款异步web框架sanic搭建web服务,遇到一个需要加特定锁的场景:同一用户并发处理订单时需要排队处理,但不同用户不需要排队。如果仅仅使用asyncwithasyncio.Lock()的话。会使所有请求都排队处理。1importasyncio2importdatetime34lock=asyncio.L......
  • GitLab添加TortoiseGIT生成SSH Key
    文章目录前言一、PuTTYgen二、GitLab前言GitLab是一个用于托管代码仓库和项目管理的Web平台,公司搭建自己的gitlab来管理代码,我们在clone代码的时候可以选择http协议,也可以选择ssh协议来拉取代码。SSH(SecureShell)是一种通过网络进行加密通信的协议,它可以用于远......
  • Python 获取tiktok视频评论回复数据 api接口
    TIKTOKapi接口爬取tiktok视频评论回复数据详细采集页面如图https://www.tiktok.com/@dailymail/video/7329872821990182190?q=neural%20link&t=1706783508149请求APIhttp://api.xxxx.com/tt/video/info/comment/reply?video_id=7288909913185701125&comment_id=7294900......
  • Shopee虾皮api python获取虾皮购物平台的商品数据信息 数据采集
    虾皮购物(英语:Shopee)是一个电商平台,总公司设在新加坡,归属于SeaGroup(之前称之为Garena),该企业于2009年由李小冬(ForrestLi)创办。虾皮购物于2015年初次在新加坡推出,现阶段已拓展到马来西亚、泰国、印度尼西亚、越南和菲律宾。虾皮购物为全球华人地区的客户提供线上购物和销售......
  • python实现图像特征提取算法1
    python实现Marr-Hildreth算法、Canny边缘检测器算法1.Marr-Hildreth算法详解算法步骤公式Python实现详细解释优缺点2.Canny边缘检测器算法详解算法步骤公式Python实现详细解释优缺点1.Marr-Hildreth算法详解Marr-Hildreth算法是一个......
  • python实现盲反卷积算法
    python实现盲反卷积算法盲反卷积算法算法原理算法实现Python实现详细解释优缺点应用领域盲反卷积算法盲反卷积算法是一种图像复原技术,用于在没有先验知识或仅有有限信息的情况下,估计模糊图像的原始清晰图像和点扩散函数(PSF)。盲反卷积在摄影、医学成......
  • Python——异常捕获,传递及其抛出操作
    01.异常的概念1.程序在运行时,如果python解释器遇到一个错误,会停止程序的执行,并且提示一些错误信息,这就是异常。2.程序停止执行并且提示错误信息这个动作,我们通常称之为:抛出(raise)异常。 程序开发时,很难将所有的特殊情况都处理的面面俱到,通过异常捕获可以针对突发事件做......
  • 【PyTorch】基于YOLO的多目标检测项目(二)
    【PyTorch】基于YOLO的多目标检测项目(一)【PyTorch】基于YOLO的多目标检测项目(二)YOLO-v3网络由跨距为2的卷积层、跳跃连接层和上采样层组成,没有池化层。网络接收一幅416*416的图像作为输入,并提供三个YOLO输出。目录准备配置文件搭建YOLO模型 搭建PyTorch模块搭......