站点抓取库的好的 Perl 或 Python 起点是啥? [复制]

Posted

技术标签:

【中文标题】站点抓取库的好的 Perl 或 Python 起点是啥? [复制]【英文标题】:What are good Perl or Python starting points for a site scraping library? [duplicate]站点抓取库的好的 Perl 或 Python 起点是什么? [复制] 【发布时间】:2012-07-30 22:32:42 【问题描述】:

可能重复:How can I screen scrape with Perl?Web scraping with Python

这不是我的工作领域,所以请原谅我普遍缺乏知识。我正在寻找用于网站抓取的 Python 或 Perl 库(从网站/各个页面上的表格中获取一些产品信息/转换为对用户更友好的格式 - Excel - 这两种语言都有令人满意的选项)并具有良好的文档。

任何人都可以就该主题提出建议或起点吗?谷歌搜索了几场有趣的比赛,但有一点时间,我宁愿不要在错误的轨道上打猎,而是宁愿相信在这件事上有一定经验的人。

【问题讨论】:

How can I screen scrape with Perl? 和 ***.com/questions/832673/… 可能重复 @Thilo - 是的,关于这个主题有几个问题。但是,它们中的大多数都是答案列表,这真的没有让我更接近。他们中的许多人甚至在他们的文档中都没有使用示例。这就是我特别说明的原因,因为我在这里上的是快速课程。 【参考方案1】:

在 python 中有一个名为 scrapy 的库以及更基本的库,例如使用 mechanize 或其他带有解析器的接口,例如 lxml 或 beautifulsoup

在 cmets 中提到他们没有教程,但是使用 mechanize 相对简单(使用它的浏览器对象),而 lxml 提供了一种使用 xpath 在 dom 中跳转的简单方法。

虽然我从未使用过,Selenium 似乎也是一个不错的选择,尽管要复杂得多

【讨论】:

我会第二个 beautifulsoup 来解析结果。对于处理现实网页,它比我尝试使用的任何其他解析器都要好。 谢谢。我会试试scrapy和soup,看看我能想出什么。如果你也有任何机会,知道任何关于这个主题的教程,这些教程对于没有任何线索的人来说是可以理解的(到目前为止主要是 NumPy 编程:/不要害羞地提出来 :) 试试这个 - pixelmender.com/2010/10/12/scraping-data-using-scrapy-framework【参考方案2】:

几天前我需要寻找一个讨厌的 html 类的所有实例,并且很快就将以下内容放在一起 - 它既是一个抓取工具又是一个爬虫,而且它很小。

import sys
import urllib.parse as uparse
import httplib2
from bs4 import BeautifulSoup

http = httplib2.Http()

hit_urls = set()

def crawl(url, check, do, depth=1):
    global hit_urls
    if url in hit_urls:
        #print("**Skipping %s" % url)
        return
    #print("Crawling %s" % url, file=sys.stderr)
    hit_urls.add(url)

    _, response = http.request(url)
    soup = BeautifulSoup(response)

    resp = do(url, soup)

    if depth > 0:
        for link in soup.find_all('a'):
            if link.has_key('href'):
                rel_url = link['href']
                if(check(rel_url)):
                    crawl(uparse.urljoin(url,rel_url), check, do, depth-1)

    return resp

def isLocal(url):
    if not url.startswith('/'):
        return False
    if url.startswith('/goToUrl'): # 3rd party redirect page
        return False
    return True

def findBadClass(url, soup):
    for t in soup.find_all(True,'class': 'badClass'):
        print(url+":"+str(t))

if __name__ == '__main__':
    crawl('http://example.com', isLocal, findBadClass)

【讨论】:

我的机器上还没有 BeautifulSoup,但我肯定会在明天使用它。一个很好的起点!谢谢迪莫! 如果你下载它并运行python setup.py build,它将创建一个lib/something/ 目录,其中包含运行Beautiful Soup 所需的一切,你可以将该/something/ 目录作为一个模块放入你的代码中进口。你也可以运行python setup.py install,它会自动将它放入你的python安装中,但我个人更喜欢手动添加库。 是的,这里也一样。安装库不是问题,但更多的是现在凌晨 2:49。当我发布问题时,我认为人们不会这么快回应:-)【参考方案3】:

如果你只是想抓取一些格式一致的网站,最简单的方法可能是使用 requests 结合正则表达式和 python 的内置字符串处理。

import re

import requests


resp = requests.get('http://austin.craigslist.org/cto/')

regex = ('<a href="(http://austin.craigslist.org/cto/[0-9]+\.html)">'
         '([a-zA-z0-9 ]+)</a>')

for i, match in enumerate(re.finditer(regex, resp.content)):
    if i > 5:
        break
    url = match.group(1)
    print 'url:', url
    resp = requests.get(url)
    title = re.search('<h2>(.+)</h2>', resp.content).group(1)
    print 'title:', title
    body = resp.content.split('<div id="userbody">', 1)[1]
    body = body.split('<script type="text/javascript">')[0]
    body = body.split('<!-- START CLTAGS -->')[0]
    print 'body:', body
    print

编辑:澄清一下,我用过 Beautiful Soup 并认为它被高估了。我认为它很奇怪,很不稳定,很难在现实世界的环境中使用。此外,为一次性抓取工具学习一个新库的工作量太大——您最好使用可以在编写 python 脚本时应用到其他地方的标准技术(即我上面建议的技术)。

【讨论】:

请不要尝试用正则表达式解析 HTML。 这就是我包含最初警告的原因。在某些情况下没有理由不使用正则表达式。 我同意漂亮的汤是靠不住的,并且使用标准技术会更好,但是在这种情况下,标准技术是 xpath 而不是正则表达式,因此首选 lxml。

以上是关于站点抓取库的好的 Perl 或 Python 起点是啥? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

爬虫--1

哪里有学习 Perl 5.10 新特性的好资源?

我可以使用 WGET 生成给定 URL 的网站的站点地图吗?

什么是用于决策树的好的 Python 库? [关闭]

Python爬虫实例

Python爬虫编程思想(48):项目实战:抓取起点中文网的小说信息