2016-07-26 78 views
2

以下数据我有一个网址:如何刮网站的页面URL没有改变,但下一个按钮添加相同的URL页面

http://www.goudengids.be/qn/business/advanced/where/Provincie%20Antwerpen/what/restaurant 

该网页上有一个“下一结果”按钮,加载另外20个数据点,同时仍显示第一个数据集,而不更新URL。我编写了一个脚本来在python中抓取这个页面,但它只是刮掉了前22个数据点,即使点击了“下一个结果”按钮并显示了大约40个数据。

我怎样才能凑这些类型网站的动态加载内容

我的剧本是

import csv 
import requests 
from bs4 import BeautifulSoup 


url = "http://www.goudengids.be/qn/business/advanced/where/Provincie%20Antwerpen/what/restaurant/" 
r = requests.get(url) 
r.content 

soup = BeautifulSoup(r.content) 
print (soup.prettify()) 

g_data2 = soup.find_all("a", {"class": "heading"}) 
for item in g_data2: 
    try: 
     name = item.text 
     print name 
    except IndexError: 
     name = '' 
     print "No Name found!" 

回答

1

而不是集中于刮HTML的,我认为你应该看看是通过AJAX检索的JSON。我认为JSON在未来不太可能改变,而不是页面的标记。最重要的是,遍历JSON结构比删除DOM更容易。

例如,当您加载您提供的页面时,它会点击一个网址以获得JSON,网址为http://www.goudengids.be/q/ajax/business/results.json

然后它提供了一些url参数来查询业务。我想你应该多进用它来获取你的数据,而不是刮的页面和模拟按钮点击等

编辑:

它看起来像它的使用从访问设置的标头该网站最初确保您拥有有效的会话。因此,您可能必须首先访问该网站才能获取cookie标头,并为后续请求设置该标头以从上面的端点获取JSON。我仍然认为这比试图抓取HTML更容易,更可预测。

2

如果你有requests来解决这个问题,就需要模仿并当您单击什么浏览器“加载更多”按钮 - 它发送一个XHR请求http://www.goudengids.be/q/ajax/business/results.json端点,模拟它在你的代码维护网页 - 采访会。该XHR响应以JSON格式 - 在这种情况下没有必要BeautifulSoup可言:

import requests 

main_url = "http://www.goudengids.be/qn/business/advanced/where/Provincie%20Antwerpen/what/restaurant/" 
xhr_url = "http://www.goudengids.be/q/ajax/business/results.json" 
with requests.Session() as session: 
    session.headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36'} 

    # visit main URL 
    session.get(main_url) 

    # load more listings - follow the pagination 
    page = 1 
    listings = [] 
    while True: 
     params = { 
      "input": "restaurant Provincie Antwerpen", 
      "what": "restaurant", 
      "where": "Provincie Antwerpen", 
      "type": "DOUBLE", 
      "resultlisttype": "A_AND_B", 
      "page": str(page), 
      "offset": "2", 
      "excludelistingids": "nl_BE_YP_FREE_11336647_0000_1746702_6165_20130000, nl_BE_YP_PAID_11336647_0000_1746702_7575_20139729427, nl_BE_YP_PAID_720348_0000_187688_7575_20139392980", 
      "context": "SRP * A_LIST" 
     } 
     response = requests.get(xhr_url, params=params, headers={ 
      "X-Requested-With": "XMLHttpRequest", 
      "Referer": main_url 
     }) 
     data = response.json() 

     # collect listing names in a list (for example purposes) 
     listings.extend([item["bn"] for item in data["overallResult"]["searchResults"]]) 

     page += 1 

     # TODO: figure out exit condition for the while True loop 

    print(listings) 

我留下了重要的TODO你 - 找出退出条件 - 当停止收集物品。

+0

当我运行脚本它给了我一个错误信息回溯(最近通话最后一个): 文件“C:\用户\用户\桌面\ python的\脚本\ 3url.py”,3号线,在 与requests.Session()作为会话: NameError:name'requests'未定义我该如何解决? – vishnu

+0

@vishnu se这个'import requests'在最上面?这个很重要。你必须安装'request'模块。 – alecxe

+0

你是对的@alecxe我真的忘了。谢谢你的大力帮助,以后我还需要你 – vishnu

相关问题