使用Selenium
包我试图在浏览器中打开URL
。浏览器可以是Firefox
或Google
。鉴于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。有没有更快的方法来完成这项任务?
答案 0 :(得分:1)
查看原始网址的响应,它只包含指向新网址的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