【问题标题】:Scrape data from lazy Loading Page从延迟加载页面中抓取数据
【发布时间】:2020-07-20 16:54:51
【问题描述】:

我正在尝试从this 网页中抓取数据,并且我能够成功地抓取我需要的数据。
问题是使用 requests 下载的页面只有 45 个产品详细信息,但实际上在该网页上它有 4000 多个产品,这是因为所有数据都无法直接获得,只有向下滚动到页面时才会显示。
我想抓取页面上所有可用的产品。

代码

import requests
from bs4 import BeautifulSoup
import json
import re

headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0'}

base_url = "link that i provided"
r = requests.get(base_url,headers=headers)
soup = BeautifulSoup(r.text, 'html.parser')

scripts = soup.find_all('script')[11].text
script = scripts.split('=', 1)[1]
script = script.rstrip()
script = script[:-1]

data = json.loads(script) 

skus = list(data['grid']['entities'].keys())

prodpage = []
for sku in skus:
   prodpage.append('https://www.ajio.com{}'.format(data['grid']['entities'][sku]['url']))

print(len(prodpage))   

【问题讨论】:

标签: python json web-scraping beautifulsoup python-requests


【解决方案1】:

向下滚动意味着数据是由 JavaScript 生成的,所以这里有多个选项 第一个是使用硒 第二个是发送网站使用的相同 Ajax 请求,如下所示:

def get_source(page_num = 1):
        url = 'https://www.ajio.com/api/category/830216001?fields=SITE&currentPage={}&pageSize=45&format=json&query=%3Arelevance%3Abrickpattern%3AWashed&sortBy=relevance&gridColumns=3&facets=brickpattern%3AWashed&advfilter=true'

        res = requests.get(url.format(1),headers={'User-Agent': 'Mozilla/5.0'})
        if res.status_code == 200 :
                return res.json()
# data = get_source(page_num = 1)
# total_pages = data['pagination']['totalPages'] # total pages are 111
prodpage = []
for i in range(1,112):
        print(f'Getting page {i}')
        data = get_source(page_num = i)['products']
        for item in data:
                prodpage.append('https://www.ajio.com{}'.format(item['url']))
        if i == 3: break
print(len(prodpage)) # output 135 for 3 pages 

【讨论】:

  • 如何为延迟加载的图像找到合适的对应请求?
猜你喜欢
  • 2015-12-07
  • 2021-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-25
  • 2011-12-22
相关资源
最近更新 更多