我正在尝试从美国专利网站获取与我的搜索查询匹配的所有专利号码列表。以下示例查询中的结果总共有大约700个条目。该页面一次只显示50个条目,我无法增加此数字。
一种方法是一次复制所有50个条目并粘贴到MS excel中并重复此操作直到最后一页。这种方法耗时且令人沮丧。是否有一种有效的方法可以以编程方式(最好是Python或R)或一次性获取整个列表。
答案 0 :(得分:1)
您可以使用 Mechanize 和 BeautifulSoup4 来使用Python执行此操作。它们相对容易安装。您可以使用Mechanize以外的库来浏览互联网,但我发现它非常易于使用。您还可以使用 Shelve 模块以python可读(字典)格式存储信息。
根据您想要获取的信息量,整个代码将是100多行。
通常,以下是编写程序的方法:
使用br=mechanize.Browser()
使用浏览器使用r=br.open(url)
使用html=r.read()
使用BeautifulSoup将html解析为可读格式soup=BeautifulSoup(html)
使用soup.findAll()
查找包含指向所需网页的链接的html元素。为了获得html中哪些对象包含此信息的模式,我建议使用Internet浏览器检查html元素和源代码。这样你就知道你在寻找什么。有时它有点棘手,因为在不同但相似的页面上对事物的索引方式不同。
每当您需要获取更多信息时,您可以继续使用新网址重复步骤2-5。这是您在底部导航页面的方式(每页限制为50个条目,但您可以自动导航它们。)
以下是我的网络抓取工具的一些示例代码:
url_dict=shelve.open(html_filename)
#opens webpage
r=br.open(first_url)
for i in range(1,20):
#navigates upper browser to next page for non-first-pages
if (i !=1):
r=br.open(first_url+str(i)+'_p/')
#collects list of urls to be navigated by sr
html=r.read()
soup=BeautifulSoup(html)
frames=soup.find_all("a",{"class":br_class})#br_class is defined globally
time.sleep(1)
for item in frames:
url_suffix=item['href']
full_url=url_prefix+url_suffix
full_url=full_url.encode('ascii','ignore')
if str(full_url) not in url_dict:
url_dict[str(full_url)]=get_information(full_url,sr)
time.sleep(1)
get_information()方法查看各种url并返回信息字典。它存储在一个文件中(使用搁置模块),因此我可以稍后将其写入人类可读的文件中。由于您只关注专利号,因此这可能不是必需的。
完成所有操作后,您可以使用Python写入csv文件。
这是我为抓取工具制作的制表符分隔的csv创建者。我仍然需要调试它,但总体布局是正确的。
def parse_data():
data=shelve.open(html_filename)
with open(out_file,'w') as out_handle:
line = '\t'
for item in header_list:
line=line+item+'\t'
out_handle.write(line)
for url in data:
line=""
for item in header_list:
line=line+data[item]+'\t'
out_handle.write(line)
print("Done writing data")
data.close()
创建文件后,您可以在正确的目录中使用python [filename]
在Windows命令行上运行它。