【问题标题】:Crawling tables from webpage从网页抓取表格
【发布时间】:2014-05-21 20:34:16
【问题描述】:

我正在尝试从此网页 (http://www.sacbee.com/statepay/#req=employee%2Fsearch%2Fname%3D%2Fyear%3D2013%2Fdepartment%3DCSU%20Sacramento) 中提取 csu 员工工资数据。我尝试过使用 urlib2 和 requests 库,但它们都没有从网页返回实际的表格。我猜原因可能是该表是由 javascript 动态生成的。下面是我使用请求的代码。

from lxml import html
import requests

page = requests.get("http://www.sacbee.com/statepay/#req=employee%2Fsearch%2Fname%3D%2Fyear%3D2013%2Fdepartment%3DCSU%20Sacramento")
tree = html.fromstring(page.text)
name = tree.xpath('//table/tbody/tr/td[2]/text()'

任何帮助/cmets 将不胜感激。

【问题讨论】:

  • 如果您检查页面,信息实际上是一个 JSON 文件。我希望你知道这意味着什么。 :D
  • 谢谢七无!我知道如何处理 json 文件,但你能指出我的 json 文件吗?我无法在网页中找到 json 文件的 url。
  • 网址是http://api.sacbeelabs.com/v1/statepay/employee/search/name=/year=2013/department=CSU%20Sacramento.json。但是,您需要为此发出 POST 请求,因为它只会在 Python 中返回以下内容:{u'status': {u'message': u'Unauthorized', u'code': 401, u'reason': u'Client origin not specified'}, u'request': {u'verb': u'statepay/employee/search/name=/year=2013/department=CSU%20Sacramento', u'params': [], u'format': u'json'}} 。
  • 嗨 Nanashi,你是如何找到 json 文件的?

标签: python html web-crawler lxml scrape


【解决方案1】:

根据我的评论,这是我的尝试。请注意,我只提取了一行数据。其他一切由您决定。

代码:

import requests as rq

url = "http://api.sacbeelabs.com/v1/statepay/employee/search/name=/year=2013/department=CSU%20Sacramento.json"
data = "74XoegZ494trsvrus_As4B4handjZ494-Adl4B4olg494dnnk933pppAmWYXaaAYjh3mnWnakWq3-Ela-B-Oahkgjqaa07tw8tJmaWlYd07tw8tJiWha07tw8uH07tw8tJqaWl07tw8uHtrsu07tw8tJZakWlnhain07tw8uHGT-107tw8trTWYlWhainj4B4labalal494dnnk933mnWYfj-8albgjpAYjh3-Boamnejim3tt_v_rt_3YlWpgeic1nWXgam1bljh1paXkWca4B4nenga494TnWnaDVjlfalDTWgWlqDTaWlYdD1DUdaDTWYlWhainjDFaaBDTWYlWhainjBDGWgebjlieW4B4mYlV49sxzrB4mYlL49srwrB4peiV49sxzrB4peiL49_stB4oW4974Wcain494Oj-CeggW3wArD-I-6ss-MD-1Xoino-MDNeio-AD-Azx2xv-MDl-89tzAr-JDKaYfj3trsrrsrsDJelabj-A3tzAr4B4njoYd49bWgmaB4Zjh4954mnjlWca4B4WiehWneji4B4YWi-8WmtZ4B4paXmjYfan4B4pjlfal4B4WoZej4B4-8eZaj4B4m-8c4B4cajgjY46B4Ymm4954WiehWneji4B4nlWimbjlh468B4omal4974Woi494Koamn488"
headers = {
'Host': 'api.sacbeelabs.com',
'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:28.0) Gecko/20100101 Firefox/28.0',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language': 'en-US,en;q=0.5',
'Accept-Encoding': 'gzip, deflate',
'X-SBAPI-Auth-Token': '0QNWbefXw6fQQcWXqK8vDw',
'X-SBAPI-SID': '3gbRqglHXAVDy1vwdcVVMf',
'X-SBAPI-CID': '2HuWho39ZcDUlTswYSWUd9',
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'Referer': 'http://www.sacbee.com/statepay/',
'Content-Length': '684',
'Origin': 'http://www.sacbee.com',
'Cookie': 'sbapi-cid=2HuWho39ZcDUlTswYSWUd9; sbapi-sid=3gbRqglHXAVDy1vwdcVVMf',
'Connection': 'keep-alive',
'Pragma': 'no-cache',
'Cache-Control': 'no-cache'
}

r = rq.post(url, data=data, headers=headers)
json_data = r.json()

base = json_data["result"]["employees"][0] # First employee.

name = base["name"]
first_name = name["first"]
last_name = name["last"]

pay = base["pay"]["total"]

title = base["title"]
dept = base["department"]

print first_name, last_name, pay, title, dept
# Your turn here...

结果:

Clayton Abajian 9844 Lecturer - Academic Year CSU Sacramento
[Finished in 0.9s]

【讨论】:

  • 非常感谢!我可以知道您的代码中的“数据”是什么吗?
  • 如果对您有帮助,请将答案标记为已接受。无论如何,数据只是我通过 Firebug 检查得到的 POST 参数。
  • 非常感谢,七无!经过一番摸索,它起作用了。我不知道您将哪个参数用于“数据”,所以我跳过了 rq.post 的数据参数,但它仍然有效。
【解决方案2】:

刚刚快速浏览了您提到的网站。这确实是由于表是使用 javascript 加载的。所以它实际上并不是您在脚本中请求的网站的一部分。

要解决此问题,您可能需要查看网站发出的 webrequests 并找到检索表数据的请求。做起来也不难,就是麻烦。看看here;类似的问题。希望对您有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-19
    相关资源
    最近更新 更多