python爬虫-豆瓣数据爬取-正则匹配

来源:互联网 发布:openssh windows 编辑:程序博客网 时间:2024/05/16 18:46

1.查看豆瓣网站的爬虫协议(robots.txt)

输入https://www.douban.com/robots.txt,显示如下:

User-agent: *Disallow: /subject_searchDisallow: /amazon_searchDisallow: /searchDisallow: /group/searchDisallow: /event/searchDisallow: /celebrities/searchDisallow: /location/drama/searchDisallow: /forum/Disallow: /new_subjectDisallow: /service/iframeDisallow: /j/Disallow: /link2/Disallow: /recommend/Disallow: /trailer/Disallow: /doubanapp/cardSitemap: https://www.douban.com/sitemap_index.xmlSitemap: https://www.douban.com/sitemap_updated_index.xml# Crawl-delay: 5User-agent: Wandoujia SpiderDisallow: /
案例一:

# -*-coding:utf-8-*-import requestsfrom bs4 import BeautifulSoup#获取豆瓣图书某一页的短评r=requests.get('https://book.douban.com/subject/27124852/comments/')#获取该书评的地址soup=BeautifulSoup(r.text,'lxml')   #将该网页进行lxml解析,如果lxml报错,则表示没有安装lxml,pip install lxml即可pattern=soup.find_all('p','comment-content')#获取p标签class属性为comment-content的字符集for item in pattern:    print item.string   #依次打印解析后的图书短评

元素获取方式:选中该书的短评,右键-检查,查看网页源代码:

运行结果:

张悦然写的很高级,这一点同龄人们中没几个能与之较量的。从故事到语言再到故事核(意识),三个层次,都能看到张关注的东西的新颖独特。张的短篇比长篇好。评分虚高,很多逻辑和感情都不通,故事也没多大趣味。喜欢这本书的朋友,你们认真的吗?行文粗糙而敷衍,内容苍白到几乎没法成文。难以想象的是,大段有气无力的描述来生硬的拼凑带着塑料味的都市故事……中二时期一度迷恋张悦然的小说,那种痴迷就像璟对丛薇的仰望,这本小说集是近年来最具有曾经气息的,好像这十年白驹过隙,故事顿了顿再继续讲。……不管生活给予我们怎样的逼仄,我们依然要执着的寻找生命的火光,向它而去。a waste of time最喜欢《大乔小乔》,喜欢姐姐的义无反顾,姐姐为了妹妹来这个家中有个合法的位置,付出了很多,最后姐姐也体会到自己在这个家中的责任与归属。余华还是会说话,这本书他居然只评价了一句:这本书对人物的把握“准确”。“准确”不应该是作家及格线上的基本功吗?然而他紧跟着说道:“准确”……

案例二:

# -*-coding:utf-8-*-import requestsimport re#获取该书的总评分r=requests.get('https://book.douban.com/subject/27124852/comments/')#获取该书评的地址pattern_s=re.compile('<span class="user-stars allstar(.*?) rating"')#使用正则匹配将评分设置为.*?p=re.findall(pattern_s, r.text)sum=0.0i=0for star in p:    sum+=int(star)    i=i+1print '该书总分为%d'%sumprint '该书平均评分为%d'%(sum/i)
评分获取方式:将评分用正则匹配(.*?)表示


运行结果:

该书总分为720该书平均评分为36

案例三:

# -*-coding:utf-8 -*-import requestsimport re#豆瓣新书速递,使用正则匹配根据元素的属性值制定新书速递书名规则r=requests.get('https://book.douban.com/latest?icn=index-latestbook-all')pattern=re.compile('<div class="detail-frame">.*?\n.*?<h2>.*?\n.*?<a.*?>(.*?)<\/a>')#新书速递书名规则t=re.findall(pattern, r.text)  n=0for item in t:    print item    n=n+1print '豆瓣新书速递:共%d本'%n

元素获取方式:图书链接处无任何属性值可使用,所以从上级的div元素往下找,中间不需要的元素用.*?替代即可,需要获取的元素用(.*?)表示

运行结果:

百年法与绝迹之鸟的短暂邂逅中国奇谭利维坦之书吃瓜时代的儿女们水浒猎人大象奔月陶潜和樱子……

案例四:(模式同案例三)

# -*-coding:utf-8 -*-import requestsimport re#豆瓣小组福田租房发布信息r=requests.get("https://www.douban.com/group/futianzufang/")pattern_top=re.compile('<td class="title">.*?\n.*?<span.*?>.*?\n.*?<img.*?>.*?\n.*?<\/span>.*?\n.*?<a.*?>(.*?)<\/a>')#置顶消息格式t1=re.findall(pattern_top, r.text)pattern=re.compile('<td class="title">.*?\n.*?<a.*?>(.*?)<\/a>')#非置顶消息格式t2=re.findall(pattern, r.text)n1=0n2=0for item1 in t1:    print item1    n1+=1for item2 in t2:    print item2    n2+=1print '福田最新租房消息:共%d条'%(n1+n2)
元素获取方式:从td标签开始定位,一直到需要获取的字段信息,同样,中间不需要的元素用.*?替代即可,需要获取的元素用(.*?)表示



运行结果:

车公庙下沙地铁口小区房,2400【个人直租】福田CBD地铁花园小区精装次卧招租-限女生福田下沙地铁口花园小区房出租曝光竹园小区黑心无良房东沙尾沙尾综合楼 合租 次卧 朝南北 精装修转租:莲花西小区房单间 有独卫 地段非常好……福田最新租房消息:共55条

案例五:(案例四中虽然可以获得想要的结果,但是使用的正则匹配方式过于复杂,稍微少一个字符就会找不到元素,这里换一种方式,使用html.parser,目前最好的html解析和分析的工具

# -*-coding:utf-8 -*-import requestsimport refrom bs4 import BeautifulSoup#直接用正则表达式找出链接中包含https://www.douban.com/group/topic/的所有链接,即为发布的所有租房信息r=requests.get("https://www.douban.com/group/futianzufang/")# print r.textsoup=BeautifulSoup(r.text,'html.parser')print '获取链接中包含https://www.douban.com/group/topic/的所有链接'links=soup.find_all('a',href=re.compile(r"https://www.douban.com/group/topic/"))n=0for link in links:    print link.name,link['href'],link.get_text()    n+=1print '共发布了%d条租房信息'%n

运行结果:

获取链接中包含https://www.douban.com/group/topic/的所有链接,即发布的所有租房信息a https://www.douban.com/group/topic/100026326/ 车公庙下沙地铁口小区房,2400a https://www.douban.com/group/topic/104274827/ 【个人直租】福田CBD地铁花园小区精装次卧招租-限女生a https://www.douban.com/group/topic/100024039/ 福田下沙地铁口花园小区房出租a https://www.douban.com/group/topic/103276050/ 曝光竹园小区黑心无良房东a https://www.douban.com/group/topic/101584595/ 沙尾沙尾综合楼 合租 次卧 朝南北 精装修a https://www.douban.com/group/topic/98614420/ 转租:莲花西小区房单间 有独卫 地段非常好……共发布了55条租房信息

ps:使用正则匹配时,可以利用在线正则表达式测试工具,如http://tool.oschina.net/regex/,将需要爬取的页面源代码复制到待匹配文本的框中,然后写好你的正则匹配公式,点击测试匹配,如果能够匹配到你需要的信息,则表示你的公式无误。