【问题标题】:Is there a way to speed up web scraping with selenium?有没有办法用硒加速网页抓取?
【发布时间】:2017-12-29 07:29:40
【问题描述】:

我正在抓取 Twitter 网站。 (API 不用于检索历史数据。)。较小的范围会很快出现,但如果您制作较大的范围,您将不得不花费大量时间。

还有一个错误,就是连接时间长了就停止了。

所以我的问题是,有什么方法可以使用 Selenium 加快网页抓取速度?还是我需要修改我的代码?

#python3
import requests
import time  
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from bs4 import BeautifulSoup

browser = webdriver.PhantomJS('C:\phantomjs-2.1.1-windows/bin/phantomjs')
url =u'https://twitter.com/search?f=tweets&vertical=default&q=%EC%84%B8%EC%9B%94%ED%98%B8%20since%3A2014-04-16%20until%3A2014-04-17&src=typd&lang=ko'


browser.get(url)
time.sleep(1)

body = browser.find_element_by_tag_name('body')


for _ in range(10000):
    browser.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    time.sleep(0.1)

tweets=browser.find_elements_by_class_name('tweet-text')

wfile = open("140416.txt", mode='w', encoding='utf8')
data={}
i = 1
for i, tweet in enumerate(tweets):
    data['text'] = tweet.text
    print(i, ":", data)
    wfile.write(str(data) +'\n')
    i += 1
wfile.close()

【问题讨论】:

  • 您的脚本正在休眠 100 毫秒 x 10000 次 = 1000 秒 = 总共约 17 分钟。因此,像这样修改您的代码:# time.sleep(0.1) 将使您的脚本快 17 分钟。
  • 你也可以使用 BeautifulSoup 中的 .findAll 来抓取推文(你传入例如 driver.page_source)。 Bs4 不是光速,但在解析 html 时仍然比 selenium 快。
  • @jlaur 有了 BeautifulSoup,你不会只带 20 条推文吗?我要带几条推文,你知道如何使用 BeautifulSoup 导入多条推文吗?不介意的话可以教教我吗?
  • 您仍然使用 selenium 来检索数据,但使用 bs4 解析它。 tweets=BeautifulSoup(browser.page_source, "html.parser").findAll(whatevertagyouneed)
  • 顺便说一句 - 您是否尝试检查内容是否通过某种 ajax 调用加载?如果是这种情况,您可以改用它...

标签: python selenium twitter web-scraping web-crawler


【解决方案1】:


1.有很多数据。根据我的脚本,有 8509 条推文。所以它需要~425 向下滚动。每次向下滚动可能需要 0.8-5 秒。因此,向下滚动大约需要 14-20 分钟。
2。重复向下滚动 10,000 次并不能保证它会加载所有推文。向下滚动后最好计数元素,检查它是否增加。

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
import time

dcap = dict(DesiredCapabilities.PHANTOMJS)
dcap["phantomjs.page.settings.userAgent"] = (
    "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/53 "
    "(KHTML, like Gecko) Chrome/15.0.87"
)
browser = webdriver.PhantomJS(desired_capabilities=dcap, executable_path='path')
url =u'https://twitter.com/search?f=tweets&vertical=default&q=%EC%84%B8%EC%9B%94%ED%98%B8%20since%3A2014-04-16%20until%3A2014-04-17&src=typd&lang=ko'
browser.get(url)
time.sleep(3)

ended = False
try:
    WebDriverWait(browser, 10).until(
        EC.presence_of_element_located((By.CSS_SELECTOR, ".tweet-text"))
    )
except:
    print("Can't find tweet text.")

tweetCount = int(browser.execute_script("return document.querySelectorAll('.tweet-text').length"))
retryCount = 0
startTime = time.time()
sleepTime=1
while not ended:
    browser.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    time.sleep(sleepTime)
    timeX= time.time()
    newCount = int(browser.execute_script("return document.querySelectorAll('.tweet-text').length"));
    timeY=time.time()
    if(newCount > tweetCount):
        tweetCount = newCount
        retryCount = 0
        print("Count: " + str(tweetCount))
    else:
        retryCount = retryCount + 1
        if(retryCount>=5):
            ended = True
            retryCount = 0


endScrollDownTime = time.time()
tweets = browser.find_elements_by_css_selector('.tweet-text')
wfile = open("140416.txt", mode='w', encoding='utf8')
data={}
i = 1
for i, tweet in enumerate(tweets):
    data['text'] = tweet.text
    wfile.write(str(data) +'\n')
    i += 1


endGetTextTime = time.time()
time1 = endScrollDownTime-startTime
time2 = endGetTextTime - endScrollDownTime
overAll = endGetTextTime - startTime
print('\n\nLength: '+str(len(tweets))+ '\nScrolldown Time:' + str(time1) + '\nGetText Time: ' + str(time2) + '\nOverall: ' + str(overAll))
browser.quit()

【讨论】:

  • "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/53" "(KHTML, like Gecko) Chrome/15.0.87" 是什么意思?我正在为 Windows 10 使用 64 位。它可以按原样使用吗?如果我必须修复它,我该如何修复它?
  • @jiji 它是网络浏览器的“用户代理”。我必须设置它。否则,twitter 将无法在我的机器上运行。您可以设置其他值。参见示例here
  • 我现在要转了。我也有疑问。如果我想查看带有计数的推文的内容,我该如何解决? 1. apple (enter) 2.bus (enter) /// cmets中没有enter函数。换句话说,你想按行存储推文。
  • @jiji 推文一一存储。如果您想查看每条推文的数量,只需将i 添加到wfile.write(str(data) +'\n')。例如。 wfile.write(str(i) + ": " + str(data) +'\n').
猜你喜欢
  • 2021-07-19
  • 2021-06-27
  • 1970-01-01
  • 2023-02-02
  • 1970-01-01
  • 2022-01-26
  • 2013-06-06
  • 1970-01-01
  • 2020-03-27
相关资源
最近更新 更多