繁体   English   中英

网站抓取库的最佳Perl或Python起点是什么? [重复]

[英]What are good Perl or Python starting points for a site scraping library? [duplicate]

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

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

任何人都可以对此主题提出建议或起点吗? 谷歌搜索提供了一些有趣的比赛,但是时间短了一点,我宁愿不要走错路,而宁愿相信在此事上有一定经验的人。

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

在评论中提到他们没有教程,但是使用机械化相对简单(使用其浏览器对象),而lxml提供了一种使用xpath绕过dom的简便方法。

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

几天前,我需要查找一个讨厌的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)

如果您只想抓取一些格式一致的网站,最简单的方法可能是将请求与正则表达式和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

编辑 :澄清一下,我使用了美丽汤,并认为它被高估了。 我认为这很奇怪而且很奇怪,在现实环境中很难使用。 此外,为一次性刮板学习一个新的库也是一项繁重的工作-您最好使用在进行python脚本编写时可以在其他地方应用的标准技术(即我在上文中建议的技术)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM