这不是我的工作领域,所以请原谅普遍缺乏知识。我正在寻找用于站点抓取的 Python 或 Perl 库(从站点/各个页面上的表格获取一些产品信息/转换为更用户友好的格式 - Excel - 这两种语言都有令人满意的选项)以及良好的文档。
任何人都可以就该主题提出建议或起点吗?谷歌搜索提供了几场有趣的比赛,但有一点时间我宁愿不要在错误的轨道上打猎,而是宁愿相信在这件事上有一定经验的人。
这不是我的工作领域,所以请原谅普遍缺乏知识。我正在寻找用于站点抓取的 Python 或 Perl 库(从站点/各个页面上的表格获取一些产品信息/转换为更用户友好的格式 - Excel - 这两种语言都有令人满意的选项)以及良好的文档。
任何人都可以就该主题提出建议或起点吗?谷歌搜索提供了几场有趣的比赛,但有一点时间我宁愿不要在错误的轨道上打猎,而是宁愿相信在这件事上有一定经验的人。
在 python 中有一个名为scrapy的库以及更基本的库,例如使用mechanize或其他接口与解析器(如lxml或beautifulsoup )
在评论中提到他们没有教程,但是使用 mechanize 相对简单(使用它的浏览器对象),而 lxml 提供了一种使用 xpath 在 dom 中跳转的简单方法。
虽然我从未使用过它,但Selenium似乎也是一个不错的选择,尽管要复杂得多
几天前,我需要寻找一个讨厌的 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
编辑:澄清一下,我用过Beautiful Soup,认为它被高估了。我认为它很奇怪,很不稳定,很难在现实世界的环境中使用。此外,为一次性刮刀学习一个新库的工作量太大——你最好使用标准技术(即我上面建议的那些),这些技术可以在编写 python 脚本时应用到其他地方。