【问题标题】:How to open a new webpage with selenium (and close the older) in Python?如何在 Python 中使用 selenium 打开一个新网页(并关闭旧网页)?
【发布时间】:2018-01-01 08:21:38
【问题描述】:

我想在 Python 2.7 中使用 selenium 对网站进行一些网页抓取,稍等片刻,然后关闭浏览器 + 关闭 geckodriver.exe(因为我不想打开数百万个浏览器页面和.exe 文件)

有什么办法可以做到吗?

我的 cmets 代码:

from bs4 import BeautifulSoup
from selenium import webdriver
import time
import urllib2
import unicodecsv as csv
import os
import sys
import io
import time
import datetime
import pandas as pd
from bs4 import BeautifulSoup
import MySQLdb
import re
import contextlib
import selenium.webdriver.support.ui as ui

#I am create a new csv file
filename=r'output.csv'

resultcsv=open(filename,"wb")
output=csv.writer(resultcsv, delimiter=';',quotechar = '"', quoting=csv.QUOTE_NONNUMERIC, encoding='latin-1')

#I am opening the website with selenium (js website)
profile=webdriver.FirefoxProfile()
profile.set_preference("intl.accept_languages","en-us")
driver = webdriver.Firefox(firefox_profile=profile)
driver.get("https://www.flightradar24.com/data/airports/bud/arrivals")
time.sleep(10)
html_source=driver.page_source
soup=BeautifulSoup(html_source,"html.parser")
print soup

#HERE I AM WEBSCRAPING THE INFORMATIONS WHAT I NEEDED AND 
#AFTER I AM WRITING IT INTO THIS CSV FILE.
 
output.writerows(datatable)
 
resultcsv.close()

#AND MY QUESTION START HERE. I WANT TO CLOSE THIS SESSEION,
#WAIT A LITTLE, FOR EXAMPLE 10 SEC, BECAUSE IT IS NEEDED SOME TIME TO WEB-
#SCRAPING DATAES AFTER THIS CLOSE THE GECKODRIVER + FIREFOX, AND AFTER 
#REPEAT THIS CODE WITH A NEW WEBSITE. IS IT POSSIBLE?

更新代码 - nutmeg64

我收到此错误消息:

文件“C:/Python27/air17.py”,第 43 行,在 刮(网址) 文件“C:/Python27/air17.py”,第 28 行,在抓取中 table = soup.find('table', { "class" : "table table-condensed table-hover data-table m-n-t-15" }) NameError: 全局名称“汤”未定义

from bs4 import BeautifulSoup
from selenium import webdriver
import time
import urllib2
import unicodecsv as csv
import os
import sys
import io
import time
import datetime
import pandas as pd
from bs4 import BeautifulSoup
import MySQLdb
import re
import contextlib
import selenium.webdriver.support.ui as ui

filename=r'output.csv'

resultcsv=open(filename,"wb")
output=csv.writer(resultcsv, delimiter=';',quotechar = '"', quoting=csv.QUOTE_NONNUMERIC, encoding='latin-1')

def scrape(urls):
    browser = webdriver.Firefox()
    for url in urls:
        browser.get(url)
        html = browser.page_source
        soup=BeautifulSoup(html,"html.parser")
        table = soup.find('table', { "class" : "table table-condensed table-hover data-table m-n-t-15" })
        datatable=[]
        for record in table.find_all('tr', class_="hidden-xs hidden-sm ng-scope"):
            temp_data = []
            for data in record.find_all("td"):
                temp_data.append(data.text.encode('latin-1'))
            datatable.append(temp_data)
 
        output.writerows(datatable)
 
        resultcsv.close()
        time.sleep(10) 
        browser.quit()

urls = ["https://www.flightradar24.com/data/airports/bud/arrivals", "https://www.flightradar24.com/data/airports/fco/arrivals"]
scrape(urls)
 

【问题讨论】:

  • 这很简单。您有 2 个选择,1:关闭浏览器,然后重新启动一个。 2:使用现有驱动导航到新页面。这真的很简单。你有什么问题?
  • 问题是我是编程世界的初学者,但我正在努力发展我的技能^^所以解决方案1:在结果csv.close()之后我必须写这个:浏览器.quit() 和 browser.get(www.google.hu) 例如?就这样? 2.解决方案听起来更好,关闭浏览器是不必要的,如何使用现有驱动程序导航到新页面?

标签: python selenium web-scraping geckodriver


【解决方案1】:

将其中的 selenium 部分放在一个函数中,并使用不同的 url 调用它。在迭代之间休眠 10 秒。

顺便说一句,这不是理想的解决方案。您只需要打开 selenium 一次,阅读源代码,然后执行 browser.get(new_url)。在所有的抓取完成后,然后执行browser.quit() 释放。

例如(非常非常简单):

def scrape(urls):
    browser = webdriver.Firefox()
    for url in urls:
        browser.get(url)
        html = browser.page_source
        # scrape the html as you like
        # create a csv file for that specific url
        # write results to csv and close it
        time.sleep(10) # <-- not really necessary. scraping and writing to csv is a long enough break
    browser.quit()

urls = ["http://example.com", "http://notarealwebsite.co.uk", "http://lastwebpagetoscrape.com" ]
scrape(urls)

【讨论】:

  • 我有大约 10 个不同的网站,这就是我选择这种方式的原因,关闭 selenium 并再次打开它。但你的建议听起来更简单。所以在结果csv.close()之后我必须写这个:例如browser.quit()和browser.get(www.google.hu)?
  • 没有。如果您有更多的抓取工作要做,请不要退出浏览器。这些是不同的 URL 并不重要。我将在答案中添加一个示例。
  • 我检查了你的示例,但是我必须在我的代码中删除哪些部分以及我必须把它放在哪里? web-scraping 部分在 html=browser...?
  • 您将 csv 创建放在函数之外。您想将所有 url 的所有结果写入同一个文件吗?我建议你尝试自己玩一点。这是最好的学习方式。
  • 是的,这就是我在外面创建的原因,我想将所有内容写入同一个文件
【解决方案2】:
from bs4 import BeautifulSoup
from selenium import webdriver
import time
import urllib2
import unicodecsv as csv
import os
import sys
import io
import time
import datetime
import pandas as pd
from bs4 import BeautifulSoup
import MySQLdb
import re
import contextlib
import selenium.webdriver.support.ui as ui

#I am create a new csv file

filename=r'output.csv'

resultcsv=open(filename,"wb")
output=csv.writer(resultcsv, delimiter=';',quotechar = '"', 
quoting=csv.QUOTE_NONNUMERIC, encoding='latin-1')

【讨论】:

    猜你喜欢
    • 2015-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-10
    • 2013-08-28
    • 2017-08-02
    • 1970-01-01
    相关资源
    最近更新 更多