#python #selenium #web-scraping #beautifulsoup
#python #selenium #очистка веб-страниц #beautifulsoup
Вопрос:
Я пытаюсь очистить данные из Google Patents и нахожу, что время выполнения занимает слишком много времени. Как я могу увеличить скорость? Просмотр 8000 патентов занял уже 7 часов…
Вот пример патента.
Мне нужно получить данные из приведенных ниже таблиц и записать их в CSV-файл. Я думаю, что горлышко бутылки находится на WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@class='table style-scope patent-result']")))
Это необходимо или я могу использовать find_elements_by_css_selector и проверить, возвращает ли это что-нибудь?
#...
from selenium.webdriver.support import expected_conditions as EC
#...
## read file of patent numbers and initiate chrome
url = "https://patents.google.com/patent/US6403086B1/en?oq=US6403086B1"
for x in patent_number:
#url = new url with new patent number similar to above
try:
driver.get(url)
driver.set_page_load_timeout(20)
except:
#--write to csv
continue
if "404" in driver.title: #patent number not found
#--write to csv
continue
try:
WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.XPATH, "//div[@class='table style-scope patent-result']"))
)
except:
#--write to csv
continue
## rest of code to get data from tables and write to csv
Есть ли более эффективный способ определить, существуют ли эти таблицы на странице патента? Или была бы разница, если бы я использовал BeautifulSoup?
Я новичок в создании веб-страниц, поэтому буду признателен за любую помощь 🙂
Комментарии:
1. Вам нужны две таблицы? Ссылки на патенты и непатентные ссылки? Все таблицы на странице?
Ответ №1:
Не уверен, какие таблицы вам нужны, но подумайте, что вы можете использовать запросы и pandas для захвата таблиц, а также сеанс для повторного использования соединения.
import requests
from bs4 import BeautifulSoup as bs
import pandas as pd
codes = ['US6403086B1','US6403086B1'] #patent numbers to come from file
with requests.Session() as s:
for code in codes:
url = 'https://patents.google.com/patent/{}/en?oq={}'.format(code, code)
r = s.get(url)
tables = pd.read_html(str(r.content))
print(tables) #example only. Remove later
#here would add some tidying up to tables e.g. dropNa rows, replace NaN with '' ....
# rather than print... whatever steps to store info you want until write out
Комментарии:
1. Я хотел бы получить данные из всех таблиц. Я пытаюсь понять разницу между BeautifulSoup и Selenium. Какое преимущество BeautifulSoup имеет перед selenium в этом случае использования? Когда я буду использовать одно поверх другого?
2. selenium позволяет автоматизировать работу браузера… javascript может отображать страницу в тех случаях, когда содержимое загружается динамически, вы можете взаимодействовать с элементами управления сайта, например, кнопками и т.д. Запросы выполняются намного быстрее, но вы теряете возможность взаимодействовать с веб-страницей, поскольку нет браузера. Кроме того, содержимое, загруженное javascript, не будет присутствовать. В вашем случае запросы выполняются быстрее. Содержимое объекта ответа затем анализируется с помощью BeautifulSoup и lxml.
3. приведенный выше ответ напечатает все таблицы. Вы можете решить, что вам с ними делать. Каждая таблица, возвращаемая нами в виде фрейма данных внутри возвращаемого списка.
4. Спасибо! Есть ли способ также захватывать заголовки таблиц? Например, мне нужны «Ссылки на патенты (1)», которые находятся перед таблицей. Я хочу использовать эти заголовки, чтобы определить, где хранить определенные табличные данные.