#python #web-scraping #beautifulsoup
#python #веб-очистка #beautifulsoup
Вопрос:
Я пытался получить цену акций в реальном времени через поиск в Google, используя веб-поиск, но он выдает ошибку
resp = requests.get("https://www.google.com/search?q=apple share priceamp;oq=apple shareamp;aqs=chrome.0.0j69i57j0l4.11811j1j7amp;sourceid=chromeamp;ie=UTF-8")
soup = bs.BeautifulSoup(resp.text,'lxml')
tab = soup.find('div',attrs = {'class':'gsrt'}).find('span').text
Объект ‘NoneType’ не имеет атрибута find
Комментарии:
1. Похоже
soup
, возвращается какNone
Ответ №1:
Вы могли бы использовать
soup.select_one('td[colspan="3"] b').text
Код:
import requests
from bs4 import BeautifulSoup as bs
headers = {'User-Agent' : 'Mozilla/5.0'}
res = requests.get('https://www.google.com/search?q=apple share priceamp;oq=apple shareamp;aqs=chrome.0.0j69i57j0l4.11811j1j7amp;sourceid=chromeamp;ie=UTF-8', headers = headers)
soup = bs(res.content, 'lxml')
quote = soup.select_one('td[colspan="3"] b').text
print(quote)
Комментарии:
1. Этот класс, который вы используете, отсутствует в HTML-ответе. Всегда стоит помнить, что запросы не будут выдавать тот же HTML, что и веб-страница, использующая браузер в большинстве случаев. Часто JS, запущенный на странице, влияет на структуру / содержимое DOM
Ответ №2:
Возможно, попробуйте это…
resp = requests.get("https://www.google.com/search?q=apple share priceamp;oq=apple shareamp;aqs=chrome.0.0j69i57j0l4.11811j1j7amp;sourceid=chromeamp;ie=UTF-8")
soup = bs(resp.text,'lxml')
tab = soup.find('div', class_='g').findAll('span')
print(tab[3].text.strip())
или, если вам нужна только цена..
resp = requests.get("https://www.google.com/search?q=apple share priceamp;oq=apple shareamp;aqs=chrome.0.0j69i57j0l4.11811j1j7amp;sourceid=chromeamp;ie=UTF-8")
soup = bs(resp.text,'lxml')
tab = soup.find('div', class_='g').findAll('span')
price = tab[3].text.strip()
print(price[:7])`
Комментарии:
1. это сработало, но почему вы поставили class_=g? Его gsrt в исходном коде
2. Что такое- price [: 7] ?
3. @TarangSomani Я не перед компьютером, но отвечаю на оба ваших вопроса. 1 — gsrt может быть в исходном коде, но я нашел нужные вам данные в div class =’g’ . 2 — price — это строка, которая включает в себя и другие данные. Поэтому я хотел только цену, и поскольку это строка [:7], она захватывает только те символы, начиная с самого первого и только до 8-го индекса, если я правильно помню.
Ответ №3:
user-agent
не указано в вашем запросе. Это может быть причиной, по которой вы получали пустой результат. Таким образом, Google рассматривает ваш запрос как запросы на python, иначе автоматизированный скрипт, вместо посещения «реального пользователя».
Это довольно легко сделать:
- Нажмите на расширение SelectorGadget Chrome (после установки).
- Нажмите на цену акций и получите
CSS
селектор, предоставленный SelectorGadget. - Используйте этот селектор для получения данных.
Код и полный пример в онлайн-среде IDE:
from bs4 import BeautifulSoup
import requests, lxml
headers = {
'User-agent':
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.19582"
}
html = requests.get('https://www.google.com/search?q=nasdaq stock price', headers=headers)
soup = BeautifulSoup(html.text, 'lxml')
current_stock_price = soup.select_one('.wT3VGc').text
print(current_stock_price)
>>> 177,33
Кроме того, вы можете сделать то же самое, используя API-интерфейс Google Direct Answer Box из SerpApi. Это платный API с бесплатной пробной версией из 5000 поисковых запросов.
Самое большое отличие в этом примере в том, что вам не нужно выяснять, почему, черт возьми, что-то не работает, хотя должно. Все уже сделано для конечного пользователя (в данном случае все выборки и выяснение, как очистить эти данные) с json
выводом.
Код для интеграции:
from serpapi import GoogleSearch
params = {
"api_key": "YOUR_API_KEY",
"engine": "google",
"q": "nasdaq stock price",
}
search = GoogleSearch(params)
results = search.get_dict()
current_stock_price = results['answer_box']['price']
print(current_stock_price)
>>> 177.42
Отказ от ответственности, я работаю в SerpApi.