Соскребая контент с сайта бесконечной прокрутки - PullRequest
3 голосов
/ 15 февраля 2020

Я пытаюсь очистить ссылки на веб-странице с бесконечной прокруткой. Я могу получить только ссылки на первой панели. Как действовать дальше, чтобы сформировать полный список всех ссылок. Вот что у меня есть -


from bs4 import BeautifulSoup
import requests

html = "https://www.carwale.com/used/cars-for-sale/#sc=-1&so=-1&car=7&pn=8&lcr=168&ldr=0&lir=0"
html_content = requests.get(html).text
soup = BeautifulSoup(html_content, "lxml")
table = soup.find_all("div", {"class": "card-detail-block__data"})

y = []
for i in table:
    try:
        y.append(i.find("a", {"id":"linkToDetails"}).get('href'))
    except AttributeError:
        pass

z = [('carwale.com' + item) for item in y]
z

Ответы [ 2 ]

1 голос
/ 15 февраля 2020

Вам не нужен BeautifulSoup для ниндзя HTML dom вообще, так как сайт предоставляет JSON ответов, которые заполнили HTML. Только запросы могут сделать работу. Если вы отслеживаете «Сеть» из Chrome или Firefox Средство разработки, вы увидите, что для каждой загрузки браузер отправляет запрос на получение API. Используя это, мы можем получить чистые json данные.

Отказ от ответственности: я не проверял, разрешает ли этот сайт очистку веб-страниц. Проверьте их условия использования. Я предполагаю, что вы сделали это.

Я использовал Pandas, чтобы помочь в работе с табличными данными, а также экспортировать данные в CSV или любой другой формат, который вы предпочитаете: pip install pandas

import pandas as pd
from requests import Session

# Using Session and a header
req = Session() 
headers = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) '\
                         'AppleWebKit/537.36 (KHTML, like Gecko) '\
                         'Chrome/75.0.3770.80 Safari/537.36',
          'Content-Type': 'application/json;charset=UTF-8'}
# Add headers
req.headers.update(headers)

BASE_URL = 'https://www.carwale.com/webapi/classified/stockfilters/'

# Monitoring the updates on Network, the params changes in each load
#sc=-1&so=-1&car=7&pn=1
#sc=-1&so=-1&car=7&pn=2&lcr=24&ldr=0&lir=0
#sc=-1&so=-1&car=7&pn=3&lcr=48&ldr=0&lir=0
#sc=-1&so=-1&car=7&pn=4&lcr=72&ldr=0&lir=0

params = dict(sc=-1, so=-1, car=7, pn=4, lcr=72, ldr=0, lir=0)

r = req.get(BASE_URL, params=params) #just like requests.get

# Check if everything is okay
assert r.ok, 'We did not get 200'

# get json data
data = r.json()

# Put it in DataFrame
df = pd.DataFrame(data['ResultData'])

print(df.head())

# to go to another page create a function:

def scrap_carwale(params):
    r = req.get(BASE_URL, params=params)
    if not r.ok:
        raise ConnectionError('We did not get 200')
    data = r.json()

    return  pd.DataFrame(data['ResultData'])


# Just first 5 pages :)    
for i in range(5):
    params['pn']+=1
    params['lcr']*=2

    dt = scrap_carwale(params)
    #append your data
    df = df.append(dt)

#print data sample
print(df.sample(10)

# Save data to csv or whatever format
df.to_csv('my_data.csv') #see df.to_?

Это сеть enter image description here

Ответ: enter image description here

Образец результатов enter image description here

0 голосов
/ 15 февраля 2020

Попробуйте это

next_page = next_page = soup.find('a', rel='next', href=True)

if next_page:
   next_html_content = requests.get(next_page).text

URL следующей страницы скрыт в источнике сайта. Вы можете найти его, выполнив поиск по тегу rel="next" в браузере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...