Как превратить код веб-скрейпинга в L oop? - PullRequest
0 голосов
/ 04 марта 2020

Мне удалось l oop процесс очистки веб-страниц, но данные, собранные на следующей странице, заменяют данные на предыдущей странице. Создание Excel содержит только данные с последней страницы. Что мне нужно сделать?

from bs4 import BeautifulSoup
import requests
import pandas as pd
print ('all imported successfuly')


for x in range(1, 44):
    link = (f'https://www.trustpilot.com/review/birchbox.com?page={x}')
    print (link)
    req = requests.get(link)
    content = req.content
    soup = BeautifulSoup(content, "lxml")
    names = soup.find_all('div', attrs={'class': 'consumer-information__name'})
    headers = soup.find_all('h2', attrs={'class':'review-content__title'})
    bodies = soup.find_all('p', attrs={'class':'review-content__text'})
    ratings = soup.find_all('div', attrs={'class':'star-rating star-rating--medium'})
    dates = soup.find_all('div', attrs={'class':'review-content-header__dates'})


print ('pass1')

df = pd.DataFrame({'User Name': names, 'Header': headers, 'Body': bodies, 'Rating': ratings, 'Date': dates})
df.to_csv('birchbox006.csv', index=False, encoding='utf-8')
print ('excel done')

Ответы [ 2 ]

0 голосов
/ 04 марта 2020

Если вы хотите запустить его только один раз и знаете общее количество страниц, все, что вам нужно сделать, - это изменить URL-адрес, который вы вызываете, и затем объединить полученные кадры данных.

Один из способов сделать это (при условии, что у вас есть python 3.6 или новее для f-строк):

df = None
for i in range(1, 44):
    req = requests.get(f"https://www.trustpilot.com/review/birchbox.com?page={i}")
    content = req.content
    soup = BeautifulSoup(content, "lxml")
    names = soup.find_all('div', attrs={'class': 'consumer-information__name'})
    headers = soup.find_all('h2', attrs={'class':'review-content__title'})
    bodies = soup.find_all('p', attrs={'class':'review-content__text'})
    ratings = soup.find_all('div', attrs={'class':'star-rating star-rating--medium'})
    dates = soup.find_all('div', attrs={'class':'review-content-header__dates'})

    print ('pass1')


    if df is None:
        df = pd.DataFrame({'User Name':names,'Header':headers,'Body':bodies,'Rating':ratings,'Date':dates})
    else:
        df = pd.concat([df, pd.DataFrame({'User Name':names,'Header':headers,'Body':bodies,'Rating':ratings,'Date':dates})])

, если вы используете более старую версию python, вы можете заменить эту строку на req = requests.get("https://www.trustpilot.com/review/birchbox.com?page={}".format(i))

0 голосов
/ 04 марта 2020

Если вы знаете количество страниц, вы можете поместить свое значение в l oop как:

for i in range(1,44):
    req = requests.get("https://www.trustpilot.com/review/birchbox.com?page={}".format(i)
    ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...