什么是Perl或Python的站点抓取库的起点?

时间:2012-08-01 23:59:23

标签: python perl screen-scraping

  

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

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

有人可以就这个问题提出建议或起点吗?谷歌搜索提供了几个有趣的比赛,但是我只是在短时间内不打算在错误的赛道上打猎,而是宁愿相信有这方面经验的人。

3 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分: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)

答案 2 :(得分:-2)

如果你只是想用一致的格式抓取一些网站,最简单的方法可能就是使用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脚本编写时应用于其他地方。