【问题标题】:Spoofing IP address when web scraping (python)网页抓取时欺骗IP地址(python)
【发布时间】:2016-08-05 09:29:13
【问题描述】:

我已在python 中制作了一个网络爬虫,以便向我提供有关各种博彩网站的免费投注优惠何时更改或添加新优惠的信息。

然而,博彩公司倾向于记录与IP 流量和MAC 地址相关的信息,以便标记匹配的更好的人。

在urllib.request 模块中使用Request() 方法时,如何欺骗我的IP 地址?

我的代码如下:

req = Request('https://www.888sport.com/online-sports-betting-promotions/', headers={'User-Agent': 'Mozilla/5.0'})
site = urlopen(req).read()
content = bs4.BeautifulSoup(site, 'html.parser')

【问题讨论】:

  • 你可以利用代理链,来实现这个!
  • 这个网站按国家过滤,你需要一个有效的代理才能做到这一点
  • req = 请求 req.set_proxy(r, "HTTP")。这抛出了一个错误,说 set_proxy() 缺少 1 个必需的位置参数:'type'。 r 是一个 127.x.x.x 的 IP 地址(我用它来测试)
  • 从字面上看,谷歌中“Python proxy urllib”的第一个链接stackoverflow.com/questions/3168171/…
  • 我用 Crawera 取得了非常非常好的结果!

标签: python web-scraping tcp


【解决方案1】:

不久前我遇到了同样的问题。这是我的代码 sn-p,我正在使用它来匿名抓取。

from urllib.request import Request, urlopen
from fake_useragent import UserAgent
import random
from bs4 import BeautifulSoup
from IPython.core.display import clear_output

# Here I provide some proxies for not getting caught while scraping
ua = UserAgent() # From here we generate a random user agent
proxies = [] # Will contain proxies [ip, port]

# Main function
def main():
  # Retrieve latest proxies
  proxies_req = Request('https://www.sslproxies.org/')
  proxies_req.add_header('User-Agent', ua.random)
  proxies_doc = urlopen(proxies_req).read().decode('utf8')

  soup = BeautifulSoup(proxies_doc, 'html.parser')
  proxies_table = soup.find(id='proxylisttable')

  # Save proxies in the array
  for row in proxies_table.tbody.find_all('tr'):
    proxies.append({
      'ip':   row.find_all('td')[0].string,
      'port': row.find_all('td')[1].string
    })

  # Choose a random proxy
  proxy_index = random_proxy()
  proxy = proxies[proxy_index]

  for n in range(1, 20):
    req = Request('http://icanhazip.com')
    req.set_proxy(proxy['ip'] + ':' + proxy['port'], 'http')

    # Every 10 requests, generate a new proxy
    if n % 10 == 0:
      proxy_index = random_proxy()
      proxy = proxies[proxy_index]

    # Make the call
    try:
      my_ip = urlopen(req).read().decode('utf8')
      print('#' + str(n) + ': ' + my_ip)
      clear_output(wait = True)
    except: # If error, delete this proxy and find another one
      del proxies[proxy_index]
      print('Proxy ' + proxy['ip'] + ':' + proxy['port'] + ' deleted.')
      proxy_index = random_proxy()
      proxy = proxies[proxy_index]

# Retrieve a random index proxy (we need the index to delete it if not working)
def random_proxy():
  return random.randint(0, len(proxies) - 1)

if __name__ == '__main__':
  main()

这将创建一些正在工作的代理。而这部分:

user_agent_list = (
   #Chrome
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 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 (Windows NT 5.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36',
    'Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36',
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36',
    'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36',
    'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36',
    'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36',
    #Firefox
    'Mozilla/4.0 (compatible; MSIE 9.0; Windows NT 6.1)',
    'Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko',
    'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)',
    'Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko',
    'Mozilla/5.0 (Windows NT 6.2; WOW64; Trident/7.0; rv:11.0) like Gecko',
    'Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko',
    'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.0; Trident/5.0)',
    'Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko',
    'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)',
    'Mozilla/5.0 (Windows NT 6.1; Win64; x64; Trident/7.0; rv:11.0) like Gecko',
    'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)',
    'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)',
    'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)'
)

这将创建不同的“标题”,伪装成浏览器。 最后但并非最不重要的一点是将这些输入到您的 request() 中。

 # Make a get request
    user_agent = random.choice(user_agent_list)
    headers= {'User-Agent': user_agent, "Accept-Language": "en-US, en;q=0.5"}
    proxy = random.choice(proxies)
    response = get("your url", headers=headers, proxies=proxy)

希望能解决你的问题。

否则看这里:https://www.scrapehero.com/how-to-fake-and-rotate-user-agents-using-python-3/

干杯

【讨论】:

  • 嘿@Yannik Suhre,谢谢。你能澄清一下 user_agent_list 是如何在第一个代码块中生成的吗?我在第二个代码块 (user_agent = random.choice(user_agent_list)) 中看到它 (user_agent_list),但不太明白它是如何从 BeautifulSoup、urllib.request、fake_useragent 和第一个代码块中的所有其他导入创建的。 .
  • @JC23 user_agent_list(这是一个列表,尽管我错误地将其写为上面的元组)只是块复制+粘贴。所以如果你想使用这个,你也必须复制这个列表。因此,此列表不依赖于 BS、请求或任何其他包,基本上它只是字符串的list。这是否为您澄清?否则请再问。
  • 嘿@Yannik Suhre 感谢您的快速回复。我想我只是头晕或误读了您的答案。
【解决方案2】:

为了克服 IP 速率禁令并隐藏您的真实 IP,您需要使用代理。有许多不同的服务提供代理。考虑将它们用作自己管理代理确实令人头疼,而且成本会高得多。我建议https://botproxy.net 等等。它们通过单个端点提供旋转代理。以下是使用此服务发出请求的方法:

#!/usr/bin/env python
import urllib.request
opener = urllib.request.build_opener(
    urllib.request.ProxyHandler(
        {'http': 'http://user-key:key-password@x.botproxy.net:8080',
         'https': 'http://user-key:key-password@x.botproxy.net:8080'}))
print(opener.open('https://httpbin.org/ip').read())

或使用请求库

import requests

res = requests.get(
    'http://httpbin.org/ip',
    proxies={
        'http': 'http://user-key:key-password@x.botproxy.net:8080',
        'https': 'http://user-key:key-password@x.botproxy.net:8080'
        },
    headers={
        'X-BOTPROXY-COUNTRY': 'US'
        })
print(res.text)

他们在不同的国家也有代理。

【讨论】:

    【解决方案3】:

    这可能有助于您匿名浏览。您可以使用一些免费的代理网站来获取代理并更新 proxy = {}。

    import requests
    from bs4 import BeautifulSoup
    url = ''
    proxy = {"http":"http://","https":"http://"}
    session = requests.session()
    response = session.get(url,headers={'User-Agent': 'Mozilla/5.0'},proxies=proxy)
    content = BeautifulSoup(response, 'html.parser')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-22
      • 2010-11-13
      • 1970-01-01
      • 2012-10-09
      • 2012-02-22
      • 2016-12-21
      • 2020-08-08
      相关资源
      最近更新 更多