如何使用BeautifulSoup从被阻止的网站中获取信息/数据?

时间:2019-01-05 12:05:11

标签: python web-scraping proxy scripting vpn

我想用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") 

2 个答案:

答案 0 :(得分:0)

您最好的解决方案是通过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

答案 1 :(得分:0)

有多种方法可以清除被阻止的网站。一种可靠的方法是使用代理服务(如前所述)。

代理服务器,也称为“代理”,是充当计算机和Internet之间的网关的计算机。 使用代理时,您的请求将通过代理转发。您的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)

并希望得到答复。

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

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

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

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

除非进行大规模的报废,否则您无需购买代理。 现在,我将重点介绍Internet上提供的免费代理。只需在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)

如果可能的话,您应该使用具有“ Elite”匿名级别的代理(在提供免费代理的大多数站点中都将指定匿名级别)。如果有兴趣,您还可以通过Google搜索找到“精英”,“匿名”和“透明”代理之间的区别。

注意:

大多数免费代理都不那么可靠。因此,如果一个IP地址和端口组合出现错误。尝试另一个。