#python #selenium #web-scraping #beautifulsoup
#python #селен #веб-очистка #beautifulsoup
Вопрос:
Я пытаюсь найти обзоры книг по указанному URL. Мне нужно название книги и каждая рецензия в отдельных строках. Ниже приведен мой код. Я использую как selenium, так и bs4. Буду признателен за любые отзывы и приношу искренние извинения, если я не придерживаюсь правил публикации, поскольку я относительно новичок на этом портале!
from selenium.webdriver import Firefox
browser = Firefox()
url ="https://www.booksaremagic.net/?q=h.tvieweramp;using_sb=status"
browser.get(url)
detailed_list = browser.find_element_by_xpath("//div[@title='Detailed']")
detailed_list.click()
books1 = []
for i in range(1,201):
page_source1 = browser.page_source
soup1 = BeautifulSoup(page_source1, "html.parser")
for book1 in soup1.find_all('td',{"nbr ca"}):
browser.find_element_by_tag_name('a[class="lightgrey bordered button moreinfo togsrus"]').click()
browser.find_element_by_xpath("//*[@id='tabber_obj_0_div_3']").click()
reviews = browser.find_element_by_id('tabber_obj_0_divbody_3').text
all_books_scraped1 = [reviews]
books1.append(all_books_scraped1)
print("Finished Extracting Page:",i)
try:
select = Select(browser.find_element_by_class_name('quicknav'))
select.select_by_value(str(i))
except:
print("nScraping Complete...")
Вывод должен быть df с:
(Cols)Обзор книг (строки) Обзор книги 1 Обзор книги 1 Обзор книги 2 Обзор книги 1 N . . . Обзор книги 9918 N
Ответ №1:
Я обнаружил, что на сайте есть какой-то API для получения данных, вот мой код:
import requests as r
from bs4 import BeautifulSoup
import re
link = 'https://www.booksaremagic.net/?q=h.tvieweramp;using_sb=statusamp;filt[status]= activenotcb,__instockamp;infscroll=1amp;amp;t=3amp;lim=500amp;dm=7amp;using_sb=statusamp;overridelim=1amp;dm=7amp;offs=0'
# Get 500 books at once, if you're planning to get more, add 500 to the offs, so it goes like 0, 500, 1000, 1500, ...
# You can use up to 10000 at once, so 0, 10000, 20000, ...
res = r.get(link)
data = res.json()
books_5 = data["rs"]
# Each row in books_5 will contain html with 5 books in it
for row in books_5:
for x in row.values():
soup = BeautifulSoup(x, "html.parser")
# Get the title
title = soup.find_all('b')[0].text
# get the link for the book
link_book = soup.find_all('a')[0]["href"]
# get the html page for the requested book
res = r.get("https://www.booksaremagic.net/" link_book "amp;t=3")
data = res.json()
try:
all_reviews_html = data["rs"][0]["sr"]["iv"]["rs"][0]["tabdata"][3]["tab_body"]
soup_text = BeautifulSoup(all_reviews_html, "html.parser").text
reviews = re.findall("“[^”] ”[^“] ", soup_text)
# start and ends with " and the other is what follows after this —
print(reviews)
except:
print(title, ": has no reviews.")
pass
# Here you have the title and all_reviews in html format for the book, extract your reviews with beautifulsoup
# add your treatement here
Вам просто нужно извлечь отзывы из html-кода all_reviews_html
, в нем есть только отзывы, а не полная страница. И у вас есть title
. Просто добавьте после этого печать.
Комментарии:
1. Не могли бы вы рассказать мне, как вы получили all_reviews_html? После этого я сделал это:
code
books1 = [] # добавьте сюда свое лечение soup1 = BeautifulSoup(all_reviews_html, ‘html.parser’) reviews = soup1.text all_books_scraped1 = [заголовок, обзоры] books1.append(all_books_scraped1)code
но там написано: all_reviews_html = данные[ «rs»][0][«sr»][«iv»][«rs»][0][«tabdata»][3][«tab_body»] ошибка, ошибка индекса: индекс списка вне диапазона2. Это работает, когда я запускаю вне цикла, извиняюсь, если мне не хватает чего-то простого!
3. Эй, я, видимо, что-то пропустил в конце. Я отредактировал код, произошла ошибка, потому что есть книги, у которых нет отзывов, в моем коде я не учитывал это. Теперь это исправлено.
4. большое вам спасибо. Есть ли способ разделить обзоры для каждой книги? Прямо сейчас я получаю столбец отзывов со всеми отзывами, сгруппированными в одну строку. В любом случае я действительно ценю вашу помощь!!
5. Я снова отредактировал код, добавил какое-то регулярное выражение, оно пока работает не идеально, но я надеюсь, вы найдете, что с этим делать.