如何使用 Python 和 Beautiful Soup 从框架中抓取信息

Posted

技术标签:

【中文标题】如何使用 Python 和 Beautiful Soup 从框架中抓取信息【英文标题】:How do I scrape information from a frame using Python and Beautiful Soup 【发布时间】:2014-01-10 14:51:28 【问题描述】:

这是我第一次尝试网络抓取。我正在尝试使用 Beautiful Soup 从 Raymond James 的网站上抓取电话号码。一个例子是http://www.raymondjames.com/office_locator_display.asp?addressline=90210

每当我使用 BeautifulSoup 时,我都无法在 html 中找到合适的信息。

import urllib2
from bs4 import BeautifulSoup

url='http://www.raymondjames.com/office_locator_display.asp?addressline=90210'

opener = urllib2.build_opener()
opener.addheaders = [('User-agent', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_3)        AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36')]
page_to_scrape=opener.open(url).read()
soup=BeautifulSoup(page_to_scrape.decode('utf-8','ignore'))

产生的输出不包含我需要的信息。我提供的 URL 似乎没有指向位置框架。

我不使用 Python 来处理网络数据的大量工作,所以我不知道如何将 Beautiful Soup 引导到“框架”中以获取联系信息。

【问题讨论】:

我相信额外的 javascript 代码会在浏览器加载页面后加载地址列表。您必须使用浏览器开发工具分析页面。寻找可能包含地址的额外网络请求,并模拟 那些 【参考方案1】:

正如 Martijn 所说,挖掘网络请求,源数据就在那里。在这种情况下,它是对 iframe 中发出的 GET 请求的 xml 响应。有了这个网址,解决方案就很简单了:

import urllib2
from bs4 import BeautifulSoup
soup = BeautifulSoup(urllib2.urlopen('http://hosted.where2getit.com/raymondjames/ajax?&xml_request=%3Crequest%3E%3Cappkey%3E7BD67064-FC36-11E0-B80D-3AEEDDB2B31E%3C%2Fappkey%3E%3Cformdata+id%3D%22locatorsearch%22%3E%3Cdataview%3Estore_default%3C%2Fdataview%3E%3Climit%3E30%3C%2Flimit%3E%3Cgeolocs%3E%3Cgeoloc%3E%3Caddressline%3E90210%3C%2Faddressline%3E%3Clongitude%3E%3C%2Flongitude%3E%3Clatitude%3E%3C%2Flatitude%3E%3Ccountry%3E%3C%2Fcountry%3E%3C%2Fgeoloc%3E%3C%2Fgeolocs%3E%3Csearchradius%3E25%7C50%7C100%3C%2Fsearchradius%3E%3C%2Fformdata%3E%3C%2Frequest%3E'), 'lxml')
# parse the points of interest into a list
pois = soup.find_all('poi')
# now have your way with them!

【讨论】:

Mattex,感谢您的帮助。我部分理解了逻辑并且能够使用 Chrome 的开发者工具找到该 url。有没有办法使用 Python 来自动化发现 url 的过程?我猜这个过程类似于获取对 get 请求的 xml 响应,然后遍历 url 以找到具有相关信息的那些,然后实际抓取信息。 我不知道如何使用 Python 来发现 URL。由于它是在 Javascript 中加载的,因此可以使用无头浏览器,例如 Selenium 或 PhantomJS。 只是一点点更新。使用 PhantomJS,我通过捕获网络请求和响应并以 JSON 格式显示它们取得了不错的进展。相关链接始终为 ID:60。现在只需将其与 BeautifulSoup 结合,然后制作一个小脚本,遍历我感兴趣的邮政编码。感谢您的指导。

以上是关于如何使用 Python 和 Beautiful Soup 从框架中抓取信息的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Python 3 和 Beautiful Soup 获取 Wikipedia 文章的文本?

如何在 Beautiful Soup 4 (Python) 中使用搜索栏

Python Beautiful Soup 解析库的使用

Python 爬虫 解析库的使用 --- Beautiful Soup

Python3网络爬虫:使用Beautiful Soup爬取小说

Python 使用 Selenium 和 Beautiful Soup 抓取 JavaScript