可能重复:
How can I screen scrape with Perl?
Web scraping with Python
这不是我的工作领域,所以原谅普遍缺乏知识。我正在寻找一个用于网站抓取的Python或Perl库(从各个页面上的网站/表格获取一些产品信息/以更加用户友好的格式 - Excel - 两种语言都有令人满意的选项)并提供良好的文档。
有人可以就这个问题提出建议或起点吗?谷歌搜索提供了几个有趣的比赛,但是我只是在短时间内不打算在错误的赛道上打猎,而是宁愿相信有这方面经验的人。
答案 0 :(得分:5)
在python中有一个名为scrapy的库以及更基本的库,例如使用mechanize或其他与lxml或beautifulsoup等解析器的接口
在评论中提到他们没有教程,但使用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脚本编写时应用于其他地方。