在URL中查找特定框架以使用Python BeautifulSoup刮取数据

时间:2015-06-28 00:26:21

标签: python html web-scraping beautifulsoup

我是HTML和网络抓取的初学者,我正在尝试使用Python BeautifulSoup获取以下显示的数据。

[
Theft06/24/15 08:47 PM2000 BLOCK OF S COLLEGE AV

Vandalism06/24/15 07:32 PM3600 BLOCK OF WELLBORN RD

Theft06/24/15 07:30 PM800 BLOCK OF RIO GRANDE LN

Theft06/24/15 06:40 PM1800 BLOCK OF FINFEATHER RD
]

但是当我解析网站http://spotcrime.com/#77801时,我无法在解析后的网址中看到div,因此无法获取数据。

我使用的代码是:

html=urllib2.urlopen('http://spotcrime.com/#77801')

soup = BeautifulSoup(html.read())
print soup

2 个答案:

答案 0 :(得分:1)

您无法找到div,因为它是由javascript动态加载和插入的。但是,在这种情况下你可以做的是复制获取所有这些犯罪数据的ajax请求。

看起来他们的内部api不需要任何形式的身份验证,因此您可以继续发送以下api请求: GET api.spotcrime.com/crimes.json?lat=30.639155&lon=-96.3647937&radius=0.02&key=spotcrime-private-api-key

作为奖励,您也不需要抓取网站,因为所有内容都作为JSON对象整齐地返回。

答案 1 :(得分:0)

而不是主要犯罪容器,只有urlopen收到:

<div id="table_container" class="list-group crime-list" style="margin-top: -30px;">
  <h3>Loading Crime Data...</h3>
  <p>City and county crime map showing crime incident data down to neighborhood crime</p>
</div>

这是因为主容器的构建是借助对http://api.spotcrime.com/crimes.json端点的额外API调用以及在浏览器中执行的javascript逻辑。

您可以做的是使用requests在代码中模拟该API调用。工作示例:

import requests

url = "http://spotcrime.com/#77801"
crimes_url = "http://api.spotcrime.com/crimes.json"

headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.130 Safari/537.36'}
with requests.Session() as session:
    session.headers = headers

    session.get(url)

    data = {
        "lat": "30.6423514",
        "lon": "-96.3704778",
        "radius": "0.02",
        "key": "spotcrime-private-api-key",
        "_": "1435453242689"
    }
    response = session.get(crimes_url, data=data)
    response = response.json()
    for item in response["crimes"]:
        print item

它打印与犯罪表中每行对应的词典:

{u'cdid': 64482204, u'lon': -96.3661035, u'lat': 30.6507387, u'link': u'http://spotcrime.com/crime/64482204-6737a0085bd9aff31548993910efa35a', u'address': u'2000 BLOCK OF S COLLEGE AV', u'date': u'06/24/15 08:47 PM', u'type': u'Theft'}
{u'cdid': 64482189, u'lon': -96.3594859, u'lat': 30.6299681, u'link': u'http://spotcrime.com/crime/64482189-345f4eca1c977f43e97ea4981f73d4de', u'address': u'3600 BLOCK OF WELLBORN RD', u'date': u'06/24/15 07:32 PM', u'type': u'Vandalism'}
...
{u'cdid': 64370976, u'lon': -96.361556, u'lat': 30.631685, u'link': u'http://spotcrime.com/crime/64370976-dc6e6dbb29fc7376c2b82356c45d281d', u'address': u'3600 BLOCK OF WELLBORN RD #802', u'date': u'06/18/15 12:37 PM', u'type': u'Arrest'}
{u'cdid': 64371003, u'lon': -96.3539954, u'lat': 30.6434707, u'link': u'http://spotcrime.com/crime/64371003-d9934d9b9d83c1867871701874c45523', u'address': u'2900 BLOCK OF S TEXAS AVENUE', u'date': u'06/18/15 09:56 AM', u'type': u'Vandalism'}