如何用Python抓取通过JavaScript返回的搜索结果

2 投票
3 回答
1830 浏览
提问于 2025-04-17 23:45

我想抓取的网站是用JavaScript来生成内容的。

我能不能直接调用这个脚本,然后处理它的结果呢?(当然,不考虑分页的问题。)我不想运行整个程序来抓取格式化后的HTML,因为原始的源代码是空的。

你可以看看这个链接: http://kozbeszerzes.ceu.hu/searchresults.xhtml?q=1998&page=0

返回的源代码就是这样:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/templates/base_template.xsl"?>
<content>
  <head>
    <SCRIPT type="text/javascript" src="/js/searchResultsView.js"></SCRIPT>    
  </head>
    <whitebox>
    <div id = "hits"></div>  
  </whitebox>
</content>

我更喜欢使用简单的Python工具。

3 个回答

1

简单来说:光靠Python是做不到的。

正如你所说,这个内容是由JavaScript(jQuery)动态添加的,也就是说它是在运行时才加上的。

你可以尝试在本地用nodejs运行脚本,某个时刻把网页的结构(DOM)导出成HTML。不过,不管怎样,你还是得去研究一下JavaScript的代码。

2

确实可以用Python来实现这个功能。你需要用到python-ghost或者Selenium。我个人更喜欢后者,再加上PhantomJS,这样更轻便,安装也简单,使用起来也很方便:

首先,用npm(Node包管理器)安装phantomjs:

apt-get install nodejs
npm install phantomjs

接着,安装selenium:

pip install selenium

然后,你就可以得到这样的页面,并像往常一样用beautifulSoup(或者其他库)来解析它:

from BeautifulSoup4 import BeautifulSoup as bs
from selenium import webdriver
client = webdriver.PhantomJS()
client.get("http://foo")
soup = bs(client.page_source)
2

我下载了SeleniumChromeDriver

from selenium import webdriver

driver = webdriver.Chrome()
driver.get('http://kozbeszerzes.ceu.hu/searchresults.xhtml?q=1998&page=0')

for e in driver.find_elements_by_class_name('result'):
    link = e.find_element_by_tag_name('a')
    print(link.text.encode('ascii', 'ignore'), link.get_attribute('href').encode('ascii', 'ignore'))

driver.quit()

如果你在用Chrome浏览器,可以按F12键来查看页面的属性,这个功能非常实用。

撰写回答