2010-07-07 48 views
1

我目前使用watir做网站抓取隐藏所有数据来自通常的HTML源的网站。如果我没有错,他们正在使用XML和AJAX技术来隐藏它。 Firefox可以看到它,但它通过“DOM源选择”显示。在txt模式下的网页抓取

一切工作正常,但现在我正在寻找一个等效的工具watir,但一切都需要在没有浏览器的情况下完成。一切都需要在txt文件中完成。

事实上,现在watir正在使用我的浏览器来模拟页面,并将我看到的整个html代码返回给我。我想同样的,但没有浏览器。

可能吗?

感谢 问候 德

回答

1

你最好的猜测是使用像webscarab并捕获AJAX的URL的请求您的浏览器做的事情。
通过这种方式,您可以通过模拟任何HTTP库中的这些调用来抓取“重要”数据。

0

这可能需要一点Python编码。

我写了一个简单的脚本来获取货运办事处的位置。

先用谷歌浏览器的步骤

  1. 打开AJAX页面例如,在土耳其,但你可以把它理解。 http://www.yurticikargo.com/bilgi-servisleri/Sayfalar/en-yakin-sube.aspx
  2. 按F12显示底部开发人员工具并导航到网络选项卡。
  3. 导航XHR标签在底部。
  4. 通过选择第一个组合框中的项目来发出AJAX请求。并去头标签
  5. 您将GetTownByCity在左侧窗格中,单击它并检查它。

    Request URL: (...)/_layouts/ArikanliHolding.YurticiKargo.WebSite/ajaxproxy- sswservices.aspx/GetTownByCity

    Request Method:POST

    Status Code:200 OK

  6. Request Payload树项目,你会看到

    Request Payload :{cityId:34} 头。

  7. 这将指导我们实现一个python代码。

让我们这样做。

#!/usr/bin/env python 
# -*- coding: utf-8 -*-  
import requests 
import json 
# import simplejson as json 
baseUrl = 'http://www.yurticikargo.com/' 
ajaxRoot = '_layouts/ArikanliHolding.YurticiKargo.WebSite/' 
getTown = 'ajaxproxy-sswservices.aspx/GetTownByCity' 
urlGetTown = baseUrl + ajaxRoot + getTown 
headers = {'content-type': 'application/json','encoding':'utf-8'} # We are sending JSON headers, equivalent to Python dictionary 
for plaka in range(1,82): # Because Turkiye has number plates from 1 to 81 
    payload = {'cityId':plaka} 
    r = requests.post(url, data=json.dumps(payload), headers=headers) 
    data = r.json() # Returning data is in JSON format, if you need HTML use r.content() 
    # ... Process the fetched data with JSON parser, 
    # If HTML format, Beautiful Soup, Lxml, or etc... 

注意,该代码是我工作的代码的一部分,它是写在飞行中,最重要的是我没有测试它。它可能需要很小的修改来运行它。