在python中使用urllib urlopen提取特斯拉充电器信息时出现HTTP错误403

在python中使用urllib urlopen提取特斯拉充电器信息时出现HTTP错误403,python,Python,我想浏览特斯拉的增压器列表,打开每一页记录连接器的数量和充电率。这是我的第一个程序之一,所以我肯定我做了一些错误的事情,但是当我使用urlopen打开多个URL时,我无法通过HTTP错误403。任何帮助都将不胜感激 from urllib.request import urlopen from bs4 import BeautifulSoup import ssl import csv ctx = ssl.create_default_context() ctx.check_hostname

我想浏览特斯拉的增压器列表,打开每一页记录连接器的数量和充电率。这是我的第一个程序之一,所以我肯定我做了一些错误的事情,但是当我使用urlopen打开多个URL时,我无法通过HTTP错误403。任何帮助都将不胜感激

from urllib.request import urlopen
from bs4 import BeautifulSoup
import ssl
import csv


ctx = ssl.create_default_context()
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE

url = 'https://www.tesla.com/findus/list/superchargers/United%20States'
html = urlopen(url, context=ctx).read()
soup_main = BeautifulSoup(html, "html.parser")

data = []
for tag in soup_main('a'):
    if '/findus/location/supercharger/' in tag.get('href',None):
        url_sc = 'https://www.tesla.com' + tag['href']
        html_sc = urlopen(url_sc, context=ctx).read()
        soup_sc = BeautifulSoup(html_sc, "html.parser")
        address = soup_sc.find('span', class_='street-address').string
        city = soup_sc.find('span', class_='locality').string[:-5]
        state = soup_sc.find('span', class_='locality').string[-3:]
        details = soup_sc.find_all('p')[1].contents[-1]
        data.append([address, city, state, details])

header = ['Address', 'City', 'State', 'Details']
with open('datapull.csv', 'w') as fp:
   writer = csv.writer(fp, delimiter=',')
   writer.writerow(header)
   for row in data:
      writer.writerow(row)

尝试向浏览器添加标题:

import urllib.request

# Request with Header Data to send User-Agent header
url_sc = 'https://www.journaldev.com'

headers = {}
headers['User-Agent'] = 'Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.27 Safari/537.17'

request = urllib.request.Request(url_sc, headers=headers)
resp = urllib.request.urlopen(request)

source

如果您不使用web浏览器,许多网站禁止您提出任何请求。最简单的解决方法是通过Selenium.htp403使用Chrome Headless,这是一个禁止的错误。这意味着,尽管服务器理解该请求,但您无权访问该端点。此特定网站似乎要求您传入特定的cookie。您可以先进入浏览器中的页面并查看networking选项卡,让网站响应python请求。您可以从
cookie
头中获取
aku bmsc
值,然后将该头添加到python请求中。这对我有用@daktoad你有我可以参考的例子的链接吗?我不太熟悉,正在努力寻找更多的信息。谢谢@Mostapasta您可以将头添加到请求中,如
urllib
文档的示例所示:。要在浏览器中查找cookie值,您可以参考本文:我尝试使用您的示例用户代理信息和我自己的信息,并收到以下两个错误:“urllib.error.urleror:@Mostapasta我编辑了它,它在我的机器上工作”您是否在PythonyWehere免费帐户上托管您的脚本?@Mostapasta请确保您已正确添加https等,并且urlopen不处理重定向,并重试。我已重试,并且能够使其正常工作。我不知道第一次是什么问题。谢谢你的帮助@Mostapasta没问题,我在无聊的一天尝试下载html,看看我是否能够找到任何保护措施并绕过这些措施(但我很久以前就没有这么做了,所以我对这些事情的记忆有点模糊),如果我的答案是确定的,请将其标记为解决方案