在 URL 中查找特定帧以使用 Python BeautifulSoup 抓取数据

Finding specific frame in URL to scrape data using Python 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 时,我在解析的 URL 中看不到 div,因此无法获取数据。

我使用的代码是:

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

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

您找不到 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 对象的形式整齐地返回。

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

它打印与犯罪中每一行对应的字典table:

{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'}