【发布时间】:2019-04-27 18:30:56
【问题描述】:
我用 python 结合 selenium 编写了一个脚本,从它的登录页面抓取不同帖子的链接,最后通过跟踪通向其内页的 url 来获取每个帖子的标题。虽然我这里解析的内容是静态的,但我使用 selenium 来看看它在多处理中是如何工作的。
但是,我的意图是使用多处理进行抓取。到目前为止,我知道 selenium 不支持多处理,但似乎我错了。
我的问题:当 selenium 使用多处理运行时,如何减少执行时间?
This is my try (it's a working one):
import requests
from urllib.parse import urljoin
from multiprocessing.pool import ThreadPool
from bs4 import BeautifulSoup
from selenium import webdriver
def get_links(link):
res = requests.get(link)
soup = BeautifulSoup(res.text,"lxml")
titles = [urljoin(url,items.get("href")) for items in soup.select(".summary .question-hyperlink")]
return titles
def get_title(url):
chromeOptions = webdriver.ChromeOptions()
chromeOptions.add_argument("--headless")
driver = webdriver.Chrome(chrome_options=chromeOptions)
driver.get(url)
sauce = BeautifulSoup(driver.page_source,"lxml")
item = sauce.select_one("h1 a").text
print(item)
if __name__ == '__main__':
url = "https://stackoverflow.com/questions/tagged/web-scraping"
ThreadPool(5).map(get_title,get_links(url))
【问题讨论】:
-
任何时候多处理开始发挥作用,它都会成为考虑从 selenium 切换到 headless chrome 的好机会。
-
@Qharr - 像 puppeteer 和 nightmarejs 这样的节点库比 selenium 更适合这样的事情。 Selenium 更受欢迎,因为它一直存在,但它有点像恐龙,主要适用于更简单的脚本。至少恕我直言。
-
不,实际上我是在建议从 python 切换到 node。
-
@pguardiario 谢谢。现在也在学习JS,这样很方便。
-
Selenium 是错误的网页抓取工具。请改用开源Scrapy Python 包。它开箱即用地进行多处理,很容易编写新脚本并将数据存储在文件或数据库中。
标签: python python-3.x selenium web-scraping multiprocessing