填写表格后抓取网页

时间:2016-06-10 21:45:01

标签: python web-scraping scrapy

我试图使用预先填充的拉链来抓取对此网站的回复: zip who(即邮政编码已填写。)我尝试使用scrapy shell执行此操作,如下所示

scrapy shell http://zipwho.com/?zip=77098&mode=zip

但响应不包含填写表单的页面,而只包含来自zipwho.com主页面的内容,并且不包含特定于该邮政编码的详细信息。我尝试使用请求和lxml填写表单信息,但显然我做错了。

import requests
import lxml.html as lh
url = 'http://zipwho.com'

form_data = {
    'zip': '77098'
    }
response = requests.post(url, data=form_data)
tree = lh.document_fromstring(response.content)
tree.xpath('//td[@class="keysplit"]')

并且数据的表元素(td,其中class =' keysplit')仍然不存在。如果你有想法让这个工作(希望有一些简单的请求和lxml),那将是最好的。

3 个答案:

答案 0 :(得分:1)

您无法在HTML中找到此数据的原因是它是使用脚本动态生成的。如果查看HTML中的第一个脚本,您将看到一个名为getData的函数,其中包含您想要的数据。另一个脚本稍后使用此功能来构建您在浏览器中看到的内容。

因此,要抓取这些数据,我只需直接从脚本中提取它:获取函数返回的字符串,将其拆分为,,依此类推。

祝你好运!

答案 1 :(得分:1)

数据位于脚本标记内,您可以使用正则表达式进行解析但是您的方法无法在scrapy或使用请求中工作,页面上没有任何内容,使用 get <检索数据/ em> params 传递的地方是模式 zip ,这是一个工作示例:

import requests
import lxml.html as lh
import re

url = 'http://zipwho.com'

params = {
    'zip': '77098',
    "mode":"zip"
    }
response = requests.get(url, params=params)
tree = lh.document_fromstring(response.content)
script = tree.xpath("/script[contains(., 'function getData()')]//text()")[0]
data = re.search('"(.*?)"', script).group(1)

答案 2 :(得分:0)

感谢以及之前的两个答案,一个功能齐全的解决方案如下:

url = 'http://zipwho.com/?zip=77098&mode=zip'
response = requests.post(url)

tree = lh.document_fromstring(response.content)

scriptText = tree.xpath("//script[contains(., 'function getData()')]")[0].text

splitVals = scriptText.split('"')[1].split('\\n')

if len(splitVals) >= 2:
    headers =splitVals[0].split(',')
    data = splitVals[1].split(',')