请求仅获取网站源代码的一部分

时间:2020-08-14 08:05:04

标签: python beautifulsoup python-requests

我正在尝试刮除target.com,它似乎只能解析网站的一部分,而没有产品(主要部分)。我的代码在Walmart上运行良好,但是此网站无法...

我的代码:

res = requests.get(f'https://www.target.com/s?searchTerm=mask')
    print(res)  # Prints 200
    try: 
      res.raise_for_status()
    except requests.exceptions.HTTPError as e: 
      print('Connection Error')  # In case the connection fails

    else:
      soup = BeautifulSoup(res.text, "html.parser")
      print(soup.find_all('li', class_='Col-favj32-0 diyyNr h-padding-a-none h-display-flex', limit = 5))

如果我打印soup.prettify(),它将打印网站的一部分,而没有产品... 我知道它可以与Selenium一起使用,我尝试过,但是需要它在没有Selenium的情况下工作。

2 个答案:

答案 0 :(得分:3)

您在页面上看到的产品数据是从外部URL加载的。您可以使用requests / json模块来加载此数据。

例如:

import json
import requests


kw = 'mask'
url = 'https://redsky.target.com/v2/plp/search/?channel=web&count=96&keyword={kw}&offset=0&pricing_store_id=3991&key=ff457966e64d5e877fdbad070f276d18ecec4a01'

data =  requests.get(url.format(kw=kw)).json()

# uncomment this to print all data;
# print(json.dumps(data, indent=4))

# print some data to screen
for i in data['search_response']['items']['Item']:
    print('{:<60} {}'.format(i['title'], i['price']['formatted_current_price']))

打印:

2pk Adult Fabric Face Mask                                   $4.00
ICU Non Medical Face Mask 20ct                               $15.99
Adult 2pk Fabric Face Mask - Colors May Vary                 $5.00
Kids&#39; 2pk Fabric Face Masks - Colors May Vary            $5.00
Intco Non-medical Disposable Face Mask - 10ct                $8.99
Cetaphil Pro Derma Control Purifying Clay Mask - 3oz         $15.99
Jurassic World Velociraptor "Blue" Chomp 'N Roar Mask        $29.99
Pixi DetoxifEYE Facial Treatment - 60ct                      $24.00

...and so on.

答案 1 :(得分:1)

您不能从美丽的汤中刮掉不存在的元素。检查页面的来源,然后亲自查看页面中是否存在要搜索的数据。显然,它不存在。它是由javascript渲染的。

对于您而言,该网站似乎正在向 API 发出 XHR请求,并使用该数据的响应来显示。要查看API,请检查元素并查看网络标签。您会看到名为 XHR 的部分。从那里,您可以搜索要获取的数据,然后向该api网址发出请求。

@Andrej是正确的,并且以相同的方式发现了API URL。