为什么不能使用Python和bs4刮取一些网页?

2024-05-06 07:24:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我得到这段代码的目的是获取HTML代码,并使用bs4对其进行刮取

from urllib.request import urlopen as uReq
from bs4 import BeautifulSoup as soup

myUrl = '' #Here goes de the webpage.

# opening up connection and downloadind the page
uClient = uReq(myUrl) 
pageHtml = uClient.read()
uClient.close()

#html parse
pageSoup = soup(pageHtml, "html.parser")
print(pageSoup)

但是,它不起作用,以下是终端显示的错误:

Traceback (most recent call last):
  File "main.py", line 7, in <module>
    uClient = uReq(myUrl)
  File "C:\ProgramData\Anaconda3\lib\urllib\request.py", line 222, in urlopen
    return opener.open(url, data, timeout)
  File "C:\ProgramData\Anaconda3\lib\urllib\request.py", line 531, in open
    response = meth(req, response)
  File "C:\ProgramData\Anaconda3\lib\urllib\request.py", line 640, in http_response
    response = self.parent.error(
  File "C:\ProgramData\Anaconda3\lib\urllib\request.py", line 569, in error
    return self._call_chain(*args)
  File "C:\ProgramData\Anaconda3\lib\urllib\request.py", line 502, in _call_chain
    result = func(*args)
  File "C:\ProgramData\Anaconda3\lib\urllib\request.py", line 649, in http_error_default
    raise HTTPError(req.full_url, code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 403: Forbidden

Tags: inpyresponserequestliblineerrorurllib
2条回答

您收到的HTTP 403错误意味着web服务器拒绝了脚本对页面的请求,因为它没有访问该页面的权限/凭据

我可以从这里访问您示例中的页面,因此最可能发生的情况是web服务器注意到您试图刮取它,并禁止您的IP地址请求更多页面。Web服务器通常这样做是为了防止刮刀影响其性能

该网站明确禁止您在此处试图执行的操作:https://www.idealista.com/ayuda/articulos/legal-statement/?lang=en

因此,我建议您联系网站所有者,请求使用API(但这可能不是免费的)

您缺少站点可能需要的某些标题

我建议使用requests包而不是urllib,因为它更灵活。请参见下面的工作示例:

import requests

url = "https://www.idealista.com/areas/alquiler-viviendas/?shape=%28%28wt_%7BF%60m%7Be%40njvAqoaXjzjFhecJ%7BebIfi%7DL%29%29"

querystring = {"shape":"((wt_{F`m{e@njvAqoaXjzjFhecJ{ebIfi}L))"}

payload = ""
headers = {
    'authority': "www.idealista.com",
    'cache-control': "max-age=0",
    'upgrade-insecure-requests': "1",
    'user-agent': "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.125 Safari/537.36",
    'accept': "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
    'sec-fetch-site': "none",
    'sec-fetch-mode': "navigate",
    'sec-fetch-user': "?1",
    'sec-fetch-dest': "document",
    'accept-language': "en-US,en;q=0.9"
    }

response = requests.request("GET", url, data=payload, headers=headers, params=querystring)

print(response.text)

从那里,您可以使用bs4解析正文:

pageSoup = soup(response.text, "html.parser")

但是,请注意,您试图抓取的站点可能会显示验证码,因此您可能需要旋转user-agent头和IP地址

相关问题 更多 >