使用 selenium 打开具有相同 class 的多篇文章并从中抓取数据
Using selenium to open multiple articles with the same class and scrape data from them
我正在尝试为我的聊天机器人创建一个数据集,以通过使用 selenium 从网站上抓取数据来学习。但是我试图打开的文章具有相同的 class 所以我必须弄清楚如何循环浏览所有这些文章。
我能够弄清楚如何打开第一个 link 并抓取数据,但我不知道如何单击第二个和第三个等等
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
import requests
import bs4
PATH = "C:\Program Files (x86)\chromedriver.exe"
driver = webdriver.Chrome(PATH)
driver.get("https://www.hybrid.cz/tagy/tesla")
link = driver.find_element_by_class_name("nodeTitle")
link.click()
url = driver.current_url
print(url)
r = requests.get(url, allow_redirects=True)
#print(r.text)
soup = bs4.BeautifulSoup(r.text, 'lxml')
for paragraphs in soup.find_all("div", {"class":"node"}):
##print(paragraphs)
with open('test.txt', 'a', encoding='utf-8') as file:
#print(paragraphs)
file.write(str(paragraphs))
time.sleep(5)
driver.back()
link2 = driver.find_element_by_xpath("//div[@class='nodeTitle']")
print(link2)
#link2.click()
现在我只是想让 link 打印出来,所以我知道可以点击一些东西,但我无法做到这一点。如有任何帮助,我将不胜感激。
非常感谢
您可以使用 CSS 选择器 h2 a
从该页面抓取指向文章的所有链接。您可以将这些链接存储到一个列表中,然后使用该列表来抓取文章。例如:
import requests
from bs4 import BeautifulSoup
def read_article(url):
rv = []
soup = BeautifulSoup(requests.get(url).content, 'html.parser')
for paragraph in soup.find_all("div", {"class":"node"}):
rv.append(paragraph.get_text(strip=True, separator=' '))
return rv
url = 'https://www.hybrid.cz/tagy/tesla'
soup = BeautifulSoup(requests.get(url).content, 'html.parser')
# 1. read all urls:
all_urls = []
for link in soup.select('h2 a'):
print(link.text)
print('https://www.hybrid.cz' + link['href'])
print('-' * 80)
all_urls.append('https://www.hybrid.cz' + link['href'])
# 2. print all articles from grabbed urls:
for url in all_urls:
print(read_article(url))
打印:
Tesla opět zdražuje, má k tomu ale pádný důvod: robotické řízení je už v betatestu neuvěřitelné!
https://www.hybrid.cz/tesla-opet-zdrazuje-ma-k-tomu-ale-padny-duvod-roboticke-rizeni-je-uz-v-betatestu-neuveritelne
--------------------------------------------------------------------------------
Tesla zveřejnila finanční výsledky a vytřela analytikům zrak, navýšila příjmy i zisk
https://www.hybrid.cz/tesla-financni-vysledky-vytrela-analytikum-zrak-navysila-prijmy-i-zisk
--------------------------------------------------------------------------------
Tesla rozjíždí betatest robotického řízení, nástup bude extrémně opatrný
https://www.hybrid.cz/tesla-rozjizdi-betatest-robotickeho-rizeni-nastup-bude-exteremne-opatrny
--------------------------------------------------------------------------------
Nové Tesla baterie jsou ještě lepší, než se čekalo: životnost přes 3,5 mil. km!
https://www.hybrid.cz/nove-tesla-baterie-jsou-jeste-lepsi-nez-se-cekalo-zivotnost-pres-35-mil-km
--------------------------------------------------------------------------------
...and so on.
我正在尝试为我的聊天机器人创建一个数据集,以通过使用 selenium 从网站上抓取数据来学习。但是我试图打开的文章具有相同的 class 所以我必须弄清楚如何循环浏览所有这些文章。
我能够弄清楚如何打开第一个 link 并抓取数据,但我不知道如何单击第二个和第三个等等
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
import requests
import bs4
PATH = "C:\Program Files (x86)\chromedriver.exe"
driver = webdriver.Chrome(PATH)
driver.get("https://www.hybrid.cz/tagy/tesla")
link = driver.find_element_by_class_name("nodeTitle")
link.click()
url = driver.current_url
print(url)
r = requests.get(url, allow_redirects=True)
#print(r.text)
soup = bs4.BeautifulSoup(r.text, 'lxml')
for paragraphs in soup.find_all("div", {"class":"node"}):
##print(paragraphs)
with open('test.txt', 'a', encoding='utf-8') as file:
#print(paragraphs)
file.write(str(paragraphs))
time.sleep(5)
driver.back()
link2 = driver.find_element_by_xpath("//div[@class='nodeTitle']")
print(link2)
#link2.click()
现在我只是想让 link 打印出来,所以我知道可以点击一些东西,但我无法做到这一点。如有任何帮助,我将不胜感激。
非常感谢
您可以使用 CSS 选择器 h2 a
从该页面抓取指向文章的所有链接。您可以将这些链接存储到一个列表中,然后使用该列表来抓取文章。例如:
import requests
from bs4 import BeautifulSoup
def read_article(url):
rv = []
soup = BeautifulSoup(requests.get(url).content, 'html.parser')
for paragraph in soup.find_all("div", {"class":"node"}):
rv.append(paragraph.get_text(strip=True, separator=' '))
return rv
url = 'https://www.hybrid.cz/tagy/tesla'
soup = BeautifulSoup(requests.get(url).content, 'html.parser')
# 1. read all urls:
all_urls = []
for link in soup.select('h2 a'):
print(link.text)
print('https://www.hybrid.cz' + link['href'])
print('-' * 80)
all_urls.append('https://www.hybrid.cz' + link['href'])
# 2. print all articles from grabbed urls:
for url in all_urls:
print(read_article(url))
打印:
Tesla opět zdražuje, má k tomu ale pádný důvod: robotické řízení je už v betatestu neuvěřitelné!
https://www.hybrid.cz/tesla-opet-zdrazuje-ma-k-tomu-ale-padny-duvod-roboticke-rizeni-je-uz-v-betatestu-neuveritelne
--------------------------------------------------------------------------------
Tesla zveřejnila finanční výsledky a vytřela analytikům zrak, navýšila příjmy i zisk
https://www.hybrid.cz/tesla-financni-vysledky-vytrela-analytikum-zrak-navysila-prijmy-i-zisk
--------------------------------------------------------------------------------
Tesla rozjíždí betatest robotického řízení, nástup bude extrémně opatrný
https://www.hybrid.cz/tesla-rozjizdi-betatest-robotickeho-rizeni-nastup-bude-exteremne-opatrny
--------------------------------------------------------------------------------
Nové Tesla baterie jsou ještě lepší, než se čekalo: životnost přes 3,5 mil. km!
https://www.hybrid.cz/nove-tesla-baterie-jsou-jeste-lepsi-nez-se-cekalo-zivotnost-pres-35-mil-km
--------------------------------------------------------------------------------
...and so on.