Python中的屏幕抓取
我刚开始接触用Python进行网页抓取,之前在R语言中做过一些类似的事情。我现在想抓取Yelp网站上的信息,具体来说,就是抓取Yelp搜索结果中每个保险公司的名字。对于大多数抓取任务,我能做到这一点,但在解析xml时总是遇到困难。
import urllib2
from BeautifulSoup import BeautifulSoup
soup = BeautifulSoup(urllib2.urlopen('http://www.yelp.com/search?find_desc=insurance+agency&ns=1&find_loc=Austin').read())
print soup
那么,在抓取一个网站时,应该遵循哪些步骤呢?每次尝试抓取一个网站时,有没有一些必要的操作需要进行?
我在Ubuntu 10.10上运行Python 2.6。
我知道这可能不是一个很好的问题,但我希望有人能提供一些关于抓取网站的一般指导和需要考虑的事项。
3 个回答
2
你可能遇到的问题是,解析那些用JavaScript动态生成的内容时遇到了困难。我写了一个关于这个主题的小教程,或许能帮到你:
http://koaning.github.io/html/scapingdynamicwebsites.html
简单来说,你需要使用selenium这个库,让它假装成一个Firefox浏览器。这个浏览器会等到所有的JavaScript都加载完成后,才会继续给你返回HTML字符串。一旦你得到了这个字符串,就可以用beautifulsoup来解析它。
2
为了简化与屏幕抓取相关的常见任务,有一个叫做 "Scrapy" 的Python框架。使用它可以轻松处理HTML和XML的解析,不再那么麻烦。
4
我建议你先了解一下xpath,然后试试这个scrapy的教程。http://doc.scrapy.org/intro/tutorial.html。写一个这样的爬虫其实挺简单的。
from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelector
class DmozSpider(BaseSpider):
name = "dmoz.org"
allowed_domains = ["dmoz.org"]
start_urls = [
"http://www.dmoz.org/Computers/Programming/Languages/Python/Books/",
"http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/"
]
def parse(self, response):
hxs = HtmlXPathSelector(response)
sites = hxs.select('//ul/li')
for site in sites:
title = site.select('a/text()').extract()
link = site.select('a/@href').extract()
desc = site.select('text()').extract()
print title, link, desc