python - 使用 python/selenium 保存完整的网页(包括 css,图像)

标签 python selenium web-scraping web-crawler bioinformatics

我正在使用 Python/Selenium 将基因序列提交到在线数据库,并希望保存我返回的整页结果。下面是让我得到我想要的结果的代码:

from selenium import webdriver

URL = 'https://blast.ncbi.nlm.nih.gov/Blast.cgi?PROGRAM=blastx&PAGE_TYPE=BlastSearch&LINK_LOC=blasthome'
SEQUENCE = 'CCTAAACTATAGAAGGACAGCTCAAACACAAAGTTACCTAAACTATAGAAGGACAGCTCAAACACAAAGTTACCTAAACTATAGAAGGACAGCTCAAACACAAAGTTACCTAAACTATAGAAGGACAGCTCAAACACAAAGTTACCTAAACTATAGAAGGACA' #'GAGAAGAGAAGAGAAGAGAAGAGAAGAGAAGAGAAGAGAAGAGAAGAGAAGAGAAGAGAAGAGAAGAGAAGAGAAGAGAAGAGAAGAGAAGAGAAGAGAAGAGAAGAGAAGAGAAGAGAAGAGAAGAGAAGA'
CHROME_WEBDRIVER_LOCATION = '/home/max/Downloads/chromedriver' # update this for your machine

# open page with selenium
# (first need to download Chrome webdriver, or a firefox webdriver, etc)
driver = webdriver.Chrome(executable_path=CHROME_WEBDRIVER_LOCATION)
driver.get(URL)
time.sleep(5)

# enter sequence into the query field and hit 'blast' button to search
seq_query_field = driver.find_element_by_id("seq")
seq_query_field.send_keys(SEQUENCE)

blast_button = driver.find_element_by_id("b1")
blast_button.click()
time.sleep(60)

那时我有一个页面,我可以手动单击“另存为”并获取一个本地文件(具有相应的图像/js Assets 文件夹),让我可以在本地查看整个返回的页面(减去内容通过向下滚动页面动态生成,这很好)。我以为会有一种简单的方法来模仿 python/selenium 中的这种“另存为”功能,但还没有找到。下面保存页面的代码只是保存了 html,并没有给我留下一个看起来像在网络浏览器中一样的本地文件,带有图像等。

content = driver.page_source
with open('webpage.html', 'w') as f:
    f.write(content)

我还找到了 this question/answer on SO ,但接受的答案只是弹出“另存为”框,并且不提供单击它的方法(正如两位评论者指出的那样)

是否有使用 python 将“[整页]另存为”的简单方法?理想情况下,我更喜欢使用 selenium 的答案,因为 selenium 使爬行部分变得如此简单,但如果有更好的工具来完成这项工作,我愿意使用另一个库。或者,也许我只需要在代码中指定我想要下载的所有图像/表格,并且没有模拟右键单击“另存为”功能的快捷方式?

更新 - 跟进詹姆斯回答的问题 所以我运行 James 的代码来生成一个 page.html(和相关文件)并将它与我通过手动单击另存为获得的 html 文件进行比较。通过 James 的脚本保存的 page.html 非常棒,拥有我需要的一切,但在浏览器中打开时,它还会显示许多隐藏在手动保存页面中的额外格式文本。请参阅随附的屏幕截图(左侧为手动保存的页面,右侧显示带有额外格式文本的脚本保存页面)。 enter image description here

这让我特别惊讶,因为 James 的脚本保存的页面的原始 html 似乎表明这些字段仍应隐藏。参见例如下面的 html,在两个文件中显示相同,但​​有问题的文本仅出现在浏览器呈现的页面中,该页面由 James 的脚本保存:

<p class="helpbox ui-ncbitoggler-slave ui-ncbitoggler" id="hlp1" aria-hidden="true">
These options control formatting of alignments in results pages. The
default is HTML, but other formats (including plain text) are available.
PSSM and PssmWithParameters are representations of Position Specific Scoring Matrices and are only available for PSI-BLAST. 
The Advanced view option allows the database descriptions to be sorted by various indices in a table.
</p>

知道为什么会这样吗?

最佳答案

如您所述,Selenium 无法与浏览器的上下文菜单交互以使用Save as...,因此您可以使用外部自动化库(如pyautogui)来代替这样做。 .

pyautogui.hotkey('ctrl', 's')
time.sleep(1)
pyautogui.typewrite(SEQUENCE + '.html')
pyautogui.hotkey('enter')

此代码通过其键盘快捷键 CTRL+S 打开 Save as... 窗口,然后按 enter 将网页及其 Assets 保存到默认下载位置.此代码还将文件命名为序列,以便为其提供唯一名称,但您可以根据您的用例更改此名称。如果需要,您还可以通过使用 Tab 键和箭头键进行一些额外操作来更改下载位置。

在 Ubuntu 18.10 上测试;根据您的操作系统,您可能需要修改发送的组合键。


完整代码,其中我还添加了条件等待以提高速度:

import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.expected_conditions import visibility_of_element_located
from selenium.webdriver.support.ui import WebDriverWait
import pyautogui

URL = 'https://blast.ncbi.nlm.nih.gov/Blast.cgi?PROGRAM=blastx&PAGE_TYPE=BlastSearch&LINK_LOC=blasthome'
SEQUENCE = 'CCTAAACTATAGAAGGACAGCTCAAACACAAAGTTACCTAAACTATAGAAGGACAGCTCAAACACAAAGTTACCTAAACTATAGAAGGACAGCTCAAACACAAAGTTACCTAAACTATAGAAGGACAGCTCAAACACAAAGTTACCTAAACTATAGAAGGACA' #'GAGAAGAGAAGAGAAGAGAAGAGAAGAGAAGAGAAGAGAAGAGAAGAGAAGAGAAGAGAAGAGAAGAGAAGAGAAGAGAAGAGAAGAGAAGAGAAGAGAAGAGAAGAGAAGAGAAGAGAAGAGAAGAGAAGA'

# open page with selenium
# (first need to download Chrome webdriver, or a firefox webdriver, etc)
driver = webdriver.Chrome()
driver.get(URL)

# enter sequence into the query field and hit 'blast' button to search
seq_query_field = driver.find_element_by_id("seq")
seq_query_field.send_keys(SEQUENCE)

blast_button = driver.find_element_by_id("b1")
blast_button.click()

# wait until results are loaded
WebDriverWait(driver, 60).until(visibility_of_element_located((By.ID, 'grView')))

# open 'Save as...' to save html and assets
pyautogui.hotkey('ctrl', 's')
time.sleep(1)
pyautogui.typewrite(SEQUENCE + '.html')
pyautogui.hotkey('enter')

关于python - 使用 python/selenium 保存完整的网页(包括 css,图像),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53729201/

相关文章:

python - 有没有Python模块可以帮助从Javascript加载的DOM中抓取数据?

python - 有没有办法在代码中使用 np.array

python - Selenium 的 driver.get() 调用的最大递归错误

python - 对类和 __init__ 文档字符串中应记录的内容是否达成共识?

python - 无效参数异常 : Message: invalid argument: 'using' must be a string

ruby-on-rails - 在测试环境中手动测试 Rails 应用程序

python - 如何限制scrapy请求对象?

node.js - 如何管理 'pool' 的 PhantomJS 实例

python - Pygame alpha 值

python - PyQt : hover and click events for graphicscene ellipse