2

可能重复:
如何使用 Perl 进行屏幕抓取?
使用 Python 进行网页抓取

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

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

4

3 回答 3

5

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

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

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

于 2012-08-02T00:03:01.180 回答
1

几天前,我需要寻找一个讨厌的 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)
于 2012-08-02T00:15:23.180 回答
-2

如果你只是想抓取一些格式一致的网站,最简单的方法可能是使用请求结合正则表达式和 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 脚本时应用到其他地方。

于 2012-08-02T00:34:15.543 回答