用 Python 在 Web 浏览器中打开和处理 URL 的最快方法

Posted

技术标签:

【中文标题】用 Python 在 Web 浏览器中打开和处理 URL 的最快方法【英文标题】:Fastest way to open and deal with a URL in a web browser in Python 【发布时间】:2018-08-28 22:32:28 【问题描述】:

使用Selenium 包我试图在浏览器中打开URL。浏览器可以是FirefoxGoogle。鉴于URL 被重定向到其他URL,浏览器必须等待它的URL 被更改。这是我正在使用的代码:

import time
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
starttime = time.time()
browser = webdriver.Firefox(executable_path='\\somepath\\chromedriver.exe')
browser.get("http://patft.uspto.gov/netacgi/nph-Parser?patentnumber=3,930,293")
wait = WebDriverWait(browser, 5)
wait.until(lambda driver: browser.current_url !=patent )
url = browser.current_url
r = requests.get(url)
soup = BeautifulSoup(r.text, 'lxml')

for tag in soup.find_all(text=re.compile('Current U.S. Class:')):
    table = tag.findParent('table')
    result = table.find('tr').text
    browser.close()
    print(result)  # Current U.S. Class: 29/428 
    print(time.time() - starttime)

但这需要太多时间(比如 18 到 20 秒),而且我有大量的这些 URL 数据集需要处理。有没有更快的方法来完成这项任务?

【问题讨论】:

好的,这对我来说将是一个新技巧我会搜索它,但你认为它会帮助我吗?如果您提供任何代码示例@OmarEinea,我将不胜感激 当然,有你的时间,如果你能帮我解决这个问题,我会感谢你的努力。非常感谢@OmarEinea 有一点,所有的网址都来自同一个网站吗? 是的,都属于同一个“USPTO”网站@OmarEinea 我只需要更改上述 URL 中的这些 3,930,293 数字,即 patft.uspto.gov/netacgi/nph-Parser?patentnumber=3,930,293 即可访问其他 URL 的 @OmarEinea 【参考方案1】:

查看原始 URL 的响应,它只包含指向新 URL 的 html 重定向:

<HTML>
<HEAD>
<TITLE>Single Document</TITLE>
<META HTTP-EQUIV="REFRESH" CONTENT="1;URL=/netacgi/nph-Parser?Sect1=PTO1&Sect2=HITOFF&d=PALL&p=1&u=%2Fnetahtml%2FPTO%2Fsrchnum.htm&r=1&f=G&l=50&s1=3,930,293.PN.&OS=PN/3,930,293&RS=PN/3,930,293">
</HEAD>
</HTML>

假设响应总是具有相同的格式/内容,您可以使用 RegEx 轻松地从该响应中捕获子 URL,如下所示:

re.search('CONTENT="1;URL=(.+)"', r.text).group(1)

那就去吧。现在这一切都可以通过请求来完成,因此您无需等待 Selenium!


这是使用上述技巧后的代码:

import time, requests, re
from bs4 import BeautifulSoup
start_time = time.time()
root_url = "http://patft.uspto.gov"
r = requests.get(root_url + "/netacgi/nph-Parser?patentnumber=3,930,293")
r = requests.get(root_url + re.search('CONTENT="1;URL=(.+)"', r.text).group(1))

soup = BeautifulSoup(r.text, 'lxml')

for tag in soup.find_all(string='Current U.S. Class:'):
    table = tag.findParent('table')
    result = table.find('tr').text
    print(result)
    print(time.time() - start_time)

输出:

Current U.S. Class: 29/428; 28/284; 28/297; 8/155 
2.2239434719085693

【讨论】:

此代码在我的机器上运行良好,但在某些 url 的虚拟机上出现错误。错误是 Nonetype 对象没有属性组。 @Omar Einea

以上是关于用 Python 在 Web 浏览器中打开和处理 URL 的最快方法的主要内容,如果未能解决你的问题,请参考以下文章

python web之html

在 Python 中以编程方式在 Web 浏览器中打开 URL

Python中的HTMLParsercookielib抓取和解析网页从HTML文档中提取链接图像文本Cookies

python学习之web中的html

Python中的urlparseurllib抓取和解析网页

求助:用delphi做了个简单浏览器,可以浏览网页,但一打开里面其他的连接,确是用IE打开的。