Удаление данных с помощью selenium webdriver и beautifulsoup - PullRequest
0 голосов
/ 08 мая 2020

Я пытаюсь получить данные из https://itcostsnothing.com/

from selenium import webdriver
from bs4 import BeautifulSoup
import pandas as pd



driver = webdriver.Chrome("C:\Users\hp\PycharmProjects\ipa3\drivers\chromedriver.exe")


names=[] #List to store name of the product
details=[] 
locations=[]
driver.get("https://itcostsnothing.com")


content = driver.page_source
soup = BeautifulSoup(content)
for a in soup.findAll('div', attrs={'class':'sc-qZtCU esHJcc'}):
    name=a.find('div', attrs={'class':'textStyle topItem'})
    detail=a.find('div', attrs={'class':'textDetailStyle'})
    location=a.find('div', attrs={'class':'textCaptionStyle'})
    names.append(name.text)
    details.append(detail.text)
    #locations.append(location.text) 

df = pd.DataFrame({'Product Name':names,'Details':details}) 
print(df)
df.to_csv('products.csv', index=False, encoding='utf-8')

Но он не получает полные данные.

Мне нужны подробные данные на главной странице содержание.

Как я могу это сделать?

1 Ответ

0 голосов
/ 08 мая 2020

Проблема здесь в том, что данные, которые вы хотите собрать, загружаются через JavaScript, и вы берете источник страницы, когда она возвращается с сервера, до того, как любой JS будет выполнен. Проблема может быть немного тонкой, так как это связано с перекрытием использования Selenium и BeautifulSoup, поэтому я буду go немного глубже ...

driver.get("https://itcostsnothing.com")
content = driver.page_source
soup = BeautifulSoup(content)

Сначала вы сообщаете Selenium go странице вы хотите данные из. Затем сразу после того, как вы возьмете источник страницы в то время. Здесь у него не было возможности заполнить данные, загруженные JS. Затем он запрашивается с помощью BeautifulSoup. Нам нужно дождаться появления элементов, которые вы хотите создать, поэтому решение становится немного более проблематичным: c.

Обычно, если вы использовали Selenium для запроса DOM, вы бы имели явное ожидание там, чтобы проверить наличие элементов, прежде чем получать от них данные. Я попробовал это, а затем взял исходный код, но либо я все еще хватаю его слишком рано, либо есть несколько слоев страницы, на которых формируются данные. В идеале вам следует отказаться от использования BeautifulSoup и выполнять все запросы в Selenium. Тем не менее, хакерский сон отлично работает и здесь, если это поможет вам:)

Вы все равно захотите настроить свой код, чтобы выбрать и распечатать элементы, чтобы захватить их все, но теперь это должно быть возможно :)

Мой последний код выглядит так ...

from bs4 import BeautifulSoup
import pandas as pd
from selenium import webdriver
import time


driver = webdriver.Chrome("C:\Users\hp\PycharmProjects\ipa3\drivers\chromedriver.exe")

names=[] #List to store name of the product
details=[] 
locations=[]
driver.get("https://itcostsnothing.com")
time.sleep(5)
content = driver.page_source
soup = BeautifulSoup(content)
for a in soup.findAll('div', attrs={'class':'sc-qZtCU esHJcc'}):
    name=a.find('div', attrs={'class':'textStyle topItem'})
    detail=a.find('div', attrs={'class':'textDetailStyle'})
    location=a.find('div', attrs={'class':'textCaptionStyle'})
    names.append(name.text)
    details.append(detail.text)
    #locations.append(location.text) 

df = pd.DataFrame({'Product Name':names,'Details':details}) 
print(df)
df.to_csv('products.csv', index=False, encoding='utf-8')
...