设为首页 收藏本站
查看: 919|回复: 0

[经验分享] 【爬了个爬——学习Python网络爬虫】1.抓取页面

[复制链接]
YunVN网友  发表于 2015-4-21 11:06:23 |阅读模式
  
  建立一个网络爬虫程序,最重要的事情就是:明确我要抓取什么,以及怎样抓取。大部分情况下,我们会希望抓取到网页中包含某些关键字的内容或者某些url,首先要实现的是对单个网页实行抓取。
  我们以一个具体的应用为例:如何的得到cnblog中某个人博客中所有随笔的题目以及连接。
  首先,我们要得到需要进行爬虫操作的网页地址,通过python系统库内的urllib2这个Module获得对应的HTML源码。



import urllib2
contents = urllib2.urlopen("http://www.baidu.com").read()
print contents
  通过上面这三句就可以将URL的源码存在content变量中,其类型为字符型。
  如果打印contents,你会发现现实的内容其实就是目标网页的源代码,接下来是要从这堆HTML源码中提取我们需要的内容。
  面对如此复杂的网页源代码,包含大量的标签及结构,我们需要一种更加高效方便的形式来完成数据的提取。这里,我们使用BeautifulSoup这个第三方库,完成数据清洗的工作。



1 from bs4 import BeautifulSoup
2 soup=BeautifulSoup(content)
3 global siteUrls
4 siteUrls = soup.findAll('a',attrs={'class':'postTitle2'})
5 print siteUrls
  siteUrls显示的内容就是我们需要的信息的初步清洗结果,它提取的是html源码中class=postTitle2的标签,结果是一个list,每个元素都对应我们所求的一个url,我们可以对这个list的每个元素进行进一步的清洗,得到需要的url。



1     strip_tag_pat=re.compile(']*>')  
2     f = file('info.txt','w')
3     for i in siteUrls:
4         i0 = re.sub(strip_tag_pat,' ',str(i))
5         i1 = str(i).split(' ')
6         #print i1
7         html = i1[2][6:-1]
8         #print html + i0
9         f.write(html+i0+'\n')
10     f.close()
  上述代码中的第一行,
    strip_tag_pat=re.compile(']*>')
是利用re这个model对list中的每个元素进行去除html标签的工作,具体的re库的内容将在以后介绍,大家也可以自行参阅python官方指南。
我们将每个元素中的标签用空白符替换掉,得到的是每个url的介绍,即每一篇博文的题目,便于我们以后对所需资料的检索。
  然后,我们用split()方法以间隔的空白符为界将每个元素分割成了一个单独的list,如:



['\xe3\x80\x90\xe6\xaf\x8f\xe6\x97\xa5\xe4\xb8\x80\xe9\xa2\x98\xe3\x80\x91CareerCup1.8', '\xe5\xad\x97\xe7\xac\xa6\xe4\xb8\xb2\xe5\x9b\x9e\xe8\xbd\xac\xe7\x9a\x84\xe6\xa3\x80\xe9\xaa\x8c']
  我们可以看到需要的html在新的List中的第二个位置,通过对list的操作我们可以得到所需的url。
  完成的源代码如下:(以我自己的博客为例)



1 '''
2 Created on 2013-3-10
3
4 @author: gixiaochen
5 '''
6 import urllib2
7 from bs4 import BeautifulSoup
8 import re
9 siteUrls = " "
10
11 url = "http://www.iyunv.com/sayary/"
12 def getContent(url):
13     content = urllib2.urlopen(url).read()
14     #print content
15
16     soup=BeautifulSoup(content)
17     global siteUrls
18     siteUrls = soup.findAll('a',attrs={'class':'postTitle2'})
19     #nextUrl = soup.find('div',attrs={'class':'topicListFooter'})
20     #print siteUrls
21     #print str(nextUrl)
22     strip_tag_pat=re.compile(']*>')
23
24     f = file('info.txt','w')
25     for i in siteUrls:
26         i0 = re.sub(strip_tag_pat,' ',str(i))
27         i1 = str(i).split(' ')
28         print i1
29         html = i1[2][6:-1]
30         #print html + i0
31         f.write(html+i0+'\n')
32     f.close()
33
34
35 getContent(url)
  我们把所得到的数据保存到了一个txt文件中,当然,我们可以保存到数据库内。
DSC0000.png
  然而这还不是结束,我们会发现,现在所得到的结果并不是一个人的全部随笔目录,而只是随笔列表中第一页的内容。
  换言之,我们的网络爬虫仅仅抓取了某个特定网页的内容,如何得到所有的随笔列表?换一个角度来说,如何真正实现爬虫”爬“的功能,让他能够抓取到我们所需的全部信息呢?下一节我们会具体讨论网路爬虫中的各种爬取的方法,如广度优先算法等。
  
  
  
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-59181-1-1.html 上篇帖子: 在MAC下 Python+Django+mysql配置 下篇帖子: 应用Python在组件式GIS中集成地质统计学
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表