【问题标题】:How to get info/data from blocked web sites with BeautifulSoup?如何使用 BeautifulSoup 从被阻止的网站获取信息/数据?
【发布时间】:2019-05-31 18:52:21
【问题描述】:

我想用 python 3.7 写一个脚本。但首先我必须它。 我在连接和从非禁止网站获取数据方面没有问题,但如果该网站被禁止,它将无法正常工作。

如果我使用 VPN 服务,我可以使用 Chrome 浏览器进入这些“被禁止”的网站。

我尝试在 pycharm 中设置代理,但失败了。我只是一直出错。 解决这个问题最简单免费的方法是什么?

from urllib.request import Request, urlopen
from bs4 import BeautifulSoup as soup

req = Request('https://www.SOMEBANNEDSITE.com/', headers={'User-Agent': 'Mozilla/5.0'})  # that web site is blocked in my country

webpage = urlopen(req).read() # code stops running at this line because it can't connect to the site. 

page_soup = soup(webpage, "html.parser") 

【问题讨论】:

    标签: python web-scraping proxy scripting vpn


    【解决方案1】:

    有多种方法可以抓取被阻止的网站。一个可靠的方法是使用已经提到的代理服务。

    代理服务器,也称为“代理”,是一台充当您的计算机和互联网之间的网关的计算机。 当您使用代理时,您的请求将通过代理转发。您的 ip 不会直接暴露给您正在抓取的网站。

    你不能简单地获取任何 ip(比如 xxx.xx.xx.xxx)和端口(比如 yy)

    import requests
    
    proxies = { 'http': "http://xxx.xx.xx.xxx:yy", 
                'https': "https://xxx.xx.xx.xxx:yy"}
    
    r = requests.get('http://www.somebannedsite.com', proxies=proxies)
    

    并期望得到回应。

    代理应配置为接受您的请求并向您发送响应。

    那么,你在哪里可以获得代理?

    一个。您可以从许多提供商处购买代理。

    b.使用互联网上的免费代理列表。

    除非您进行大规模抓取,否则您无需购买代理。 现在,我将专注于互联网上提供的免费代理。只需在 Google 上搜索“免费代理提供商”,您就会找到提供免费代理的网站列表。转到其中任何一个并获取任何ip 和对应的port

    import requests
    
    #replace the ip and port below with the ip and port you got from any of the free sites
    
    proxies = { 'http': "http://182.52.51.155:39236", 
                'https': "https://182.52.51.155:39236"}
    
    r = requests.get('http://www.somebannedsite.com', proxies=proxies)
    print(r.text)
    

    如果可能,您应该使用具有“精英”匿名级别的代理(大多数提供免费代理的网站都会指定匿名级别)。如果有兴趣,您还可以进行谷歌搜索以找出“精英”、“匿名”和“透明”代理之间的区别。

    注意:

    这些免费代理中的大多数都不是那么可靠。因此,如果您使用一个 ip 和端口组合出现错误。换一个试试。

    【讨论】:

    • 我已经尝试了一切(以及您的解决方案),但仍然出现此错误:blablablabla......(由 ProxyError('无法连接到代理。',OSError('隧道连接失败) : 400 Bad Request'))) 我尝试了多个主机,但都是一样的。我现在不在乎匿名。但我只是想让这个工作。请帮帮我,我要疯了两天。为什么会这样?我关闭了我的防火墙,仍然收到错误
    • @blackwater111 您好,只需转到free-proxy-list.net 并从那里获得不同的代理和 IP 组合。我知道这会让您感到沮丧,但请尝试一下。
    • @blackwater111 你能提供你想要废弃的网站吗?我可以尝试一下。
    • @blackwater111 我会更新我的答案并让你知道。我认为您不能使用请求,可能需要硒。还可以考虑删除您之前的评论。不同年龄段的人都来SO。
    • 好的,我删除了它。其他一些人也建议使用硒,但我有一个问题,我可以用硒做一些查询吗?我喜欢刮,例如,我可以挑选超过 30 分钟的视频,并且在 2015 年之后发布。像这样的东西....这适用于硒吗?也有人说这么慢。这是正确的吗?
    【解决方案2】:

    您最好的解决方案是通过requests 库使用代理。这将是您的最佳解决方案,因为它通过代理具有flexibly handling the requests 的功能。

    这是一个小例子:

    import requests
    from bs4 import BeautifulSoup as soup
    # use your usable proxies here
    # replace host with you proxy IP and port with port number
    proxies = { 'http': "http://host:port", 
                'https': "https://host:port"} 
    
    text = requests.get('http://www.somebannedsite.com', proxies=proxies, headers={'User-Agent': 'Mozilla/5.0'}).text
    page_soup = soup(text, "html.parser") # use whatever parser you prefer, maybe lxml?
    

    如果您想使用 SOCKS5,则必须通过 pip install requests[socks] 获取依赖项,然后将代理部分替换为:

    # user is your authentication username
    # pass is your auth password
    # host and port are similar as above
    proxies = { 'http': 'socks5://user:pass@host:port', 
                'https': 'socks5://user:pass@host:port' }
    

    如果您手头没有代理,您可以fetch some proxies

    【讨论】:

    • 如果你有时间,你能写出确切的代码吗?因为我一整天都在尝试使用 requests 库,但我仍然无法让它工作。我唯一想要的就是从那个被禁止的网站获取一些简单的数据。
    • 刚刚尝试了您的代码,但没有返回任何内容。这些地址和端口是否正确,或者我必须找到一些有效的?真的感谢您的努力。
    • 我还是有问题。首先,请确定:这是导入代理的正确方法吗? proxies = { 'http': "194.228.129.189:50946", 'https': "194.228.129.189:50946", } 如果是这样,则此代码不起作用。当我运行它时,我得到了一个巨大的错误列表。我也从谷歌获得这些代理,我只是谷歌免费代理列表,它们会工作吗?
    • 不,您的代理必须在 IP 地址之前有方案(http:// 或 https://)。查看official docs 关于处理代理的信息。你会明白的。
    • 文件“C:\Users\USER\PycharmProjects\3.7_Project\venv\lib\site-packages\requests\adapters.py”,第 510 行,在发送中引发 ProxyError(e, request=request ) requests.exceptions.ProxyError: HTTPSConnectionPool(host='www.BANNED.com', port=443): 最大重试次数超出 url: /remaining_link_of_BANNED/ (由 ProxyError('Cannot connect to proxy.', NewConnectionError(':无法建立新连接:[WinError 10061] 由于目标机器主动拒绝,无法建立连接')))
    猜你喜欢
    • 1970-01-01
    • 2020-07-28
    • 1970-01-01
    • 1970-01-01
    • 2018-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多