设为首页收藏本站language 语言切换
查看: 1136|回复: 1
收起左侧

[问题求助] python3和scrapy使用亿牛云隧道代理问题以及代码

[复制链接]
发表于 2023-3-2 17:22:47 | 显示全部楼层 |阅读模式
一、前言
近期,我参与了一个需要爬取国家食品药品监督局数据的项目,但该网站存在IP屏蔽机制。因此,我需要在Scrapy框架中实现自动IP切换,才能完成任务。然而,尽管我使用了第三方库scrapy-proxys和代理API接口,但测试并不成功。
爬取药监局数据是一项不容易完成的任务。这是因为该网站采用了多种反爬虫机制,如IP屏蔽、频率限制等,以避免窃取机密数据信息。因此,在实施这项任务时,我们需要使用各种技术工具和方法来克服这些障碍。
对于大多数企业,使用爬虫程序和库工具是一项不错的选择,其中最常用的是Scrapy和Python3。这些工具具有强大的功能,可以轻松地爬取网站上的数据。但要想成功抓取药监局的数据,我们还需要实现IP自动切换的功能,以确保IP被屏蔽后,程序可以顺利地继续运行下去。
亿牛云官方给出了python3和scrapy的参考示例
python3示例
  1. import requests,random

  2. #要访问的目标页面
  3. target_url = "https://www.nmpa.gov.cn/"

  4. #代理信息
  5. proxy_host = "u6791.5.tn.16yun"
  6. proxy_port = "31111"
  7. proxy_user = "16EDRSSX"
  8. proxy_pass = "214575"
  9. proxy_meta = "http://%(user)s:%(pass)s@%(host)s:%(port)s" % {
  10.         "host" : proxy_host,
  11.         "port" : proxy_port,
  12.         "user" : proxy_user,
  13.         "pass" : proxy_pass,
  14.     }

  15. #设置http和https访问都是用HTTP代理
  16. proxies = {
  17.     "http": proxy_meta,
  18.     "https": proxy_meta
  19. }

  20. #设置IP切换头
  21. tunnel = random.randint(1, 10000)
  22. headers = {"Proxy-Tunnel": str(tunnel)}

  23. try:
  24.     #访问目标页面
  25.     resp = requests.get(target_url, proxies=proxies, headers=headers)

  26.     #获取状态码和网页内容
  27.     status_code = resp.status_code
  28.     content = resp.text

  29.     #输出状态码和网页内容
  30.     print(f"status_code:{status_code}\ncontent:{content}")
  31.    
  32. except requests.exceptions.RequestException as e:
  33.     print(e)
复制代码
以上是python的原本使用方式,下面提供scrapy的中间件示例
在项目中新建middlewares.py文件(./项目名/middlewares.py)
  1. import base64
  2. import sys

  3. PY3 = sys.version_info[0] >= 3

  4. def base64ify(bytes_or_str):
  5.     input_bytes = bytes_or_str if PY3 else bytes_or_str.encode('utf8')
  6.     output_bytes = base64.urlsafe_b64encode(input_bytes)
  7.     return output_bytes.decode('ascii') if PY3 else output_bytes

  8. class ProxyMiddleware2(object):               
  9.     def process_request(self, request, spider):
  10.         # 选择一个代理服务器
  11.         proxyHost = "u6791.5.tn.16yun"
  12.         proxyPort = "31111"

  13.         # 设置IP地址和端口号
  14.         request.meta['proxy'] = "http://{0}:{1}".format(proxyHost, proxyPort)

  15.         # 设置代理用户名和密码(根据需要开启/关闭)
  16.         # proxyUser = "16EDRSSX"
  17.         # proxyPass = "214587"
  18.         # request.headers['Proxy-Authorization'] = 'Basic ' + base64ify(proxyUser + ":" + proxyPass)
  19.         
  20.         # 设置隧道(根据需要开启/关闭)
  21.         # tunnel = random.randint(1,10000)
  22.         # request.headers['Proxy-Tunnel'] = str(tunnel)

  23.         # 修改连接方式为Close,每次都切换到新的IP
  24.         request.headers['Connection'] = "Close"
复制代码




您需要登录后才可以回帖 登录 | 论坛注册

本版积分规则

QQ|Archiver|手机版|小黑屋|sitemap|鸿鹄论坛 ( 京ICP备14027439号 )  

GMT+8, 2025-4-25 12:34 , Processed in 0.122169 second(s), 24 queries , Redis On.  

  Powered by Discuz!

  © 2001-2025 HH010.COM

快速回复 返回顶部 返回列表