python - 在 Python 中阻止 GET 请求的解决方法

标签 python python-3.x beautifulsoup

我正在尝试使用请求和beautifulsoup 来检索和处理网络搜索的结果。

我编写了一些简单的代码来完成这项工作,它成功返回(状态 = 200),但请求的内容只是一条错误消息“对于给您带来的任何不便,我们深表歉意,但该站点目前不可用。” ,并且在过去几天中一直如此。但是,在 Firefox 中搜索返回的结果没有问题。我已经使用英国站点的 URL 运行了代码,并且它可以正常工作,所以我想知道美国站点是否设置为阻止抓取网络搜索的尝试。

有没有办法掩盖我试图从 Python 中检索搜索结果的事实(例如,伪装成 Firefox 中的标准搜索)或其他一些允许访问搜索结果的工作?

包含以下代码供引用:

import pandas as pd
from requests import get
import bs4 as bs
import re
# works
# baseURL = 'https://www.autotrader.co.uk/car-search?sort=sponsored&radius=1500&postcode=ky119sb&onesearchad=Used&onesearchad=Nearly%20New&onesearchad=New&make=TOYOTA&model=VERSO&year-from=1990&year-to=2017&minimum-mileage=0&maximum-mileage=200000&body-type=MPV&fuel-type=Diesel&minimum-badge-engine-size=1.6&maximum-badge-engine-size=4.5&maximum-seats=8'
# doesn't work
baseURL = 'https://www.autotrader.com/cars-for-sale/Certified+Cars/cars+under+50000/Jeep/Grand+Cherokee/Seattle+WA-98101?extColorsSimple=BURGUNDY%2CRED%2CWHITE&maxMileage=45000&makeCodeList=JEEP&listingTypes=CERTIFIED%2CUSED&interiorColorsSimple=BEIGE%2CBROWN%2CBURGUNDY%2CTAN&searchRadius=0&modelCodeList=JEEPGRAND&trimCodeList=JEEPGRAND%7CSRT%2CJEEPGRAND%7CSRT8&zip=98101&maxPrice=50000&startYear=2015&marketExtension=true&sortBy=derivedpriceDESC&numRecords=25&firstRecord=0'
a = get(baseURL)
soup = bs.BeautifulSoup(a.content,'html.parser')

info = soup.find_all('div', class_ = 'information-container')
price = soup.find_all('div', class_ = 'vehicle-price')

d = [] 
for idx, i in enumerate(info):
    ii = i.find_next('ul').find_all('li')

    year_ = ii[0].text
    miles = re.sub("[^0-9\.]", "", ii[2].text)
    engine = ii[3].text
    hp = re.sub("[^\d\.]", "", ii[4].text)
    p = re.sub("[^\d\.]", "", price[idx].text)

    d.append([year_, miles, engine, hp, p])

df = pd.DataFrame(d, columns=['year','miles','engine','hp','price']) 

最佳答案

默认情况下,Requests 在发出请求时会发送一个唯一的用户代理。

>>> r = requests.get('https://google.com')
>>> r.request.headers
{'User-Agent': 'python-requests/2.22.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive'}

您正在使用的网站可能试图通过拒绝用户代理 python-requests 的任何请求来避免抓取。 .

要解决此问题,您可以 change your user agent发送请求时。由于它可以在您的浏览器上运行,只需复制您的浏览器用户代理(您可以谷歌它,或记录对网页的请求并像这样复制您的用户代理)。对我来说,是 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36 (真是一口),所以我会这样设置我的用户代理:

>>> headers = {
...     'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36'
... }

然后发送带有新 header 的请求(新 header 被添加到默认 header 中,除非它们具有相同的名称,否则它们不会替换它们):

>>> r = requests.get('https://google.com', headers=headers)  # Using the custom headers we defined above
>>> r.request.headers
{'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive'}

现在我们可以看到请求是使用我们首选的 header 发送的,希望该站点无法区分请求和浏览器之间的区别。

关于python - 在 Python 中阻止 GET 请求的解决方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57155387/

相关文章:

python - 我如何访问YouTube第一搜索结果?

Python bs4 删除 br 标签

python - 如何在 Ubuntu 14.04 上安装 wxPython 3.0.2.0?

python - Mechanize - 无需单击提交按钮即可提交表单

python - 每当我尝试在 PyCharm 上配置 Python 解释器时都会收到错误

python - 导入 Python 文件是否也会将导入的文件导入 shell?

python - 尝试使用 Python 和 BS4 将抓取的值导入 MySQL 表时抛出警告

python - 如何从 Django 网站启动 Python 脚本?

python - QProgressBar 中的 MySQL 咨询

python - 带有整数的 'while' 在 Python 中是什么意思,这个 GCD 代码是如何工作的?