什么都不说了,先上代码,代码里面有很详细的解释,
参考地址为:
这个代码并未使用BeautifulSoup
很快我们将使用BeautifulSoup
1 #coding:utf8 2 import urllib2 3 import re 4 url = "http://www.baidu.com/s?wd=steve+jobs" # 百度搜索关键字steve jobs 5 content = urllib2.urlopen(url).read() 6 # 将URL的源码存在content变量中,其类型为字符形 7 urls_pat = re.compile(r'(.*?)') 8 # 上面括号里面是要去的的内容,(.*?)是指标签中所有的东西 9 # re.compile是将字符串编译为用于python正则式的模式,10 # 字符前的r表示是纯字符,这样就不需要对元字符进行两次转义11 siteUrls = re.findall(urls_pat , content)12 #############################################13 for (i,v) in enumerate(siteUrls): # i是数组siteUrls的索引,v是siteUrls的值14 print v15 #############################################16 # 上下两种方法都能遍历输出结果,原因是siteUrls 是数组类型17 #for i in range(0,len(siteUrls)):18 # print siteUrls[i]
运行结果为:
alex@universe ~/python/OOP $ python spider.py www.apple.com/stevejobs/ 2013-3-13 cn.engadget.com/tag/SteveJobs/ 2013-3-13 book.douban.com/subject/65121... 2013-3-13 wenku.baidu.com/view/dd72f7eeb8f67c1... 2012-7-10 www.forbes.com/profile/steve...jobs/ 2013-3-24 www.yeeyan.org/articles/view/Alexhon... 2013-3-13 www.ifanr.com/6619 2013-3-13 www.businessinsider.com/blackboard/s... 2013-3-13
这说明这样用了urllib2, re 模块后,我们抓取到一定的数据
下面我们用BeautifulSoup做一下
其下载地址:
The current release of Beautiful Soup 3 is (February 16, 2012). You can install Beautiful Soup 3 with pip install BeautifulSoup
or easy_install BeautifulSoup
. It's also available as python-beautifulsoup
in Debian and Ubuntu, and as python-BeautifulSoup
on Red Hat.
我用的是linuxmint,是ubuntu分支的,所以可以这样安装。sudo easy_install BeautifulSoup
alex@universe ~/python/OOP $ sudo easy_install BeautifulSoup[sudo] password for alex: Searching for BeautifulSoupBest match: BeautifulSoup 3.2.0Adding BeautifulSoup 3.2.0 to easy-install.pth fileUsing /usr/lib/python2.7/dist-packagesProcessing dependencies for BeautifulSoupFinished processing dependencies for BeautifulSoup
1 #coding:utf8 2 import urllib2 3 from BeautifulSoup import BeautifulSoup 4 url = "http://www.baidu.com/s?wd=steve+jobs" # 百度搜索关键字steve jobs 5 content = urllib2.urlopen(url).read() 6 # 将URL的源码存在content变量中,其类型为字符形 7 soup = BeautifulSoup(content) 8 siteUrls = soup.findAll('span',attrs = { 'class':'g'}) 9 ############################################10 for (i,v) in enumerate(siteUrls): # i是数组siteUrls的索引,v是siteUrls的值11 print v12 #############################################13 # 上下两种方法都能遍历输出结果,原因是siteUrls 是数组类型14 #for i in range(0,len(siteUrls)):15 # print siteUrls[i]
输出结果为:
alex@universe ~/python/OOP $ python spider_BeautifulSoup.py www.apple.com/stevejobs/ 2013-3-13 cn.engadget.com/tag/SteveJobs/ 2013-3-13 book.douban.com/subject/65121... 2013-3-13 wenku.baidu.com/view/dd72f7eeb8f67c1... 2012-7-10 www.forbes.com/profile/steve...jobs/ 2013-3-24 www.yeeyan.org/articles/view/Alexhon... 2013-3-13 www.ifanr.com/6619 2013-3-13 www.businessinsider.com/blackboard/s... 2013-3-13
这里并没有去掉html标签。
BeautifulSoup()可以把刚才抓到的字符串转化为Beautiful的对象。这样就可以应用BeautifulSoup提供的一些方法处理HTML。比如,findAll('a')就可以返回一个所有页面的a标签的List,我觉得这个和JS里面的getElementByTagName挺像的。另外也可以指定attrs参数,这个参数就是一个筛选条件,其数据结构是一个字典。findAll('span',attrs={'class':'g'})的意思就是返回所有class='g'的span标签的内容(包括span标签自身)。
用正则式和BeautifulSoup获得内容还需要进一步处理,因为其中包含html标签。类似,hi.baidu.com/<b>cloga</b> 2010-8-29或者<span> hi.baidu.com/<b>cloga</b> 2010-8-29 </span>,同样可以用正则式的sub方法替换掉这些标签。
strip_tag_pat=re.compile(r'<.*?>') file=open('results000.csv','w') for i in results: i0=re.sub(strip_tag_pat,'',i) i0=i0.strip() i1=i0.split(' ') date=i1[-1] siteUrl=''.join(i1[:-1]) rank+=1 file.write(date+','+siteUrl+','+str(rank)+'\n') file.close()
再来就是把对应的结果输出到文件中,比如,排名、URL、收入日期这样的形式。OK,这样就用Python实现了一个简单的爬虫需求。秀一下上面代码的输出。
文章来源:Cloga与网站|数字分析,转载请注明出处。