Python网络爬虫爬取虎扑步行街爆照区话题
来源:互联网 发布:淘宝店铺如何优化 编辑:程序博客网 时间:2024/04/27 21:50
Python网络爬虫爬取虎扑步行街爆照区话题
作者:郜科科
最近的任务挺多的,但是心情很烦躁,想做一些自己喜欢的东西,前些时候感觉Python爬虫很好玩,就自学了一下。本人比较喜欢逛街——虎扑步行街,所以就打算从虎扑步行街的爆照区入手,做一个爬虫,爬取一些爆照区的帖子内容和照片玩一玩。当然了,假如掌握了这门技术,做一些不可描述的事情。。嗯。。我是一名合格的共产党员。。。本次我用了Beautiful Soup的爬虫框架来写,之前用的Scrapy框架感觉像做填空题,没有写代码的感觉,很不爽不清晰,好了,下面开始正题:
1、安装Beautiful Soup环境
直接在cmd里面运行: pipinstall beutifulsoup4
我用的是Python 2.7 如果用Python3的话。。。应该不支持BeautifuSoup的4版本,可能3版本吧
2、安装bs4解析器
这里我用了lxml,这也是windows下常用的解析器,还是一样简单,cmd里面运行: pip installlxml
3、找一个IDE,随意,开始写代码
这里先讲一下爬虫的流程:
(1)找到爆照区的主页https://bbs.hupu.com/selfie,然后看一下网页的源码,找到帖子的主题部分,找到这个唯一标示的DIV标签,然后下边就有帖子的相关内容了,什么题目了,作者了,时间了,帖子链接了等等。我们把这些东西全部存起来,将来可以分析用,主要这里是用到了帖子的链接,把这些帖子链接存起来然后一会让爬虫挨个帖子把里面的图爬下来。
(2)然后让爬虫进入每个帖子的界面然后找到图片,通过Python自带的函数保存到本地,就大功告成了。是不是很简单。
4,我这里就把代码先贴上去,其实呢,中间还是遇到不少的困难的,比如怎么通过bs4的find()和find_all()来找到想要的标签,怎么得到未加载的图片,怎么在标题复杂的情况下提取标题内容,怎么下载不同图片类型等等,我在代码里都做了注释。如果环境配置好了,代码可以直接运行。
#-*- coding: utf-8 -*-'''creat on 2017.4.15@author: gaokeke'''import urllib2from bs4 import BeautifulSoupimport logging# 以下解决编码问题,与主题无关import sysreload(sys)sys.setdefaultencoding( "utf-8" )class Item(object): title = None #帖子标题 firstAuthor = None #帖子原作者 firstTime = None #帖子创建时间 reNum = None #帖子回复浏览数量 LastTime = None #帖子最后回复时间 LastAuthor = None #帖子最后回复作者 link = None #帖子链接# 全局方法获取网页内容def getResponseContent(url): try: response = urllib2.urlopen(url.encode('utf8'),timeout=20) except: logging.error(u'Python返回URL:{}数据失败'.format(url)) else: logging.info(u'Python返回URL:{}数据成功'.format(url)) return response.read()class getHupuInfo(object): def __init__(self,url): self.url = url self.pageSum = 3 #帖子页数做多100页 self.urls = self.getUrls(self.pageSum) self.items = self.spider(self.urls) self.pipelines(self.items) def getUrls(self,pageSum): urls = [] urls.append(self.url) for pn in range(1,pageSum): tempurl = self.url + '-'+ str(pn+1) urls.append(tempurl) logging.info(u'获取URLS成功!\n') return urls def spider(self,urls): items = [] for url in urls: htmlContent = getResponseContent(url) soup = BeautifulSoup(htmlContent,'lxml') tagtable = soup.find('table',attrs={'id':'pl'}) tagstr = tagtable.find_all('tr') flag = 0 #跳过标题栏 for tag in tagstr: if flag == 0: flag +=1 continue else: flag += 1 item = Item() item.link = '/'+ tag.get('mid') + '.html' # 直接抓取mid属性作为帖子链接 item.title = tag.find('td', attrs={'class': 'p_title'}).find('a',href = item.link).get_text()#通过item.link来确定标题 item.firstAuthor = tag.find('td', attrs={'class': 'p_author'}).a.get_text() item.firstTime = tag.find('td', attrs={'class': 'p_author'}).get_text() item.reNum = tag.find('td', attrs={'class': 'p_re'}).get_text() item.LastAuthor = tag.find('td', attrs={'class': 'p_retime'}).a.get_text() item.LastTime = tag.find('td', attrs={'class': 'p_retime'}).get_text() items.append(item) logging.info(u'获取帖子成功') return items def pipelines(self,items): fileName = u'Hupu_bxj.txt' with open(fileName,'w') as fp: for item in items: #fp.write('{}\t{}\t{}\t{}\t{}\t{}\n{}\n\n'.format(item.title,item.firstAuthor,item.firstTime,item.reNum,item.LastAuthor,item.LastTime,item.link)) fp.write('{}\n '.format(item.title).encode('utf8'))# 为了生词词云,这里只提取了题目 logging.info(u'写入文本成功') def getpiclink(self): piclink = [] for item in self.items: piclink.append(self.url[0:20] + item.link) logging.info(u'返回图片帖子链接成功') return piclinkclass picInfo(object): def __init__(self,links): self.links = links self.imgurls = [] self.spider() self.pipeline() def spider(self): if self.links == None: logging.error('无图片链接') else: for link in self.links: htmlContent = getResponseContent(link) soup = BeautifulSoup(htmlContent,'lxml') tagDiv = soup.find('div',attrs={'id':'tpc'}) img = tagDiv.find('div',attrs={'class':'quote-content'}).find_all('img') if img == None: continue else: for subimg in img: # 解决图片未加载的情况 if subimg.get('data-original') == None: imgurl = subimg.get('src') else: imgurl = subimg.get('data-original') self.imgurls.append(imgurl) logging.info(u'获取图片链接成功') def pipeline(self): for i in range(len(self.imgurls)): #根据链接后缀确定图片类型 if self.imgurls[i][-3:] == 'png': imgname = str(i) + '.png' elif self.imgurls[i][-3:] == 'jpg': imgname = str(i) + '.jpg' elif self.imgurls[i][-4:] == 'jpeg': imgname = str(i) + '.jpeg' elif self.imgurls[i][-3:] == 'gif': imgname = str(i) + '.jpeg' else: continue img = getResponseContent(self.imgurls[i]) with open (imgname, 'ab') as fp: fp.write(img) logging.info(u'写入图片成功')if __name__ == '__main__': logging.basicConfig(level= logging.INFO) url = u'https://bbs.hupu.com/selfie' HUPU = getHupuInfo(url) picurls = HUPU.getpiclink() PIC = picInfo(picurls)
5、我只爬取了大概一页帖子的图片和内容大概一百多张图,然后他们的标题做了个词云,就酱紫,感觉。。还挺好玩。在线词云:https://timdream.org/wordcloud/
哎。。。。单身狗就不应该点开这帖子。。不过好在有些图还不错能安慰一下我。。
- Python网络爬虫爬取虎扑步行街爆照区话题
- Python爬取虎扑步行街,爆照区中的照片
- python爬虫实战(一)--爬取知乎话题图片
- python 网络爬虫代码
- Python实现网络爬虫
- Python实现网络爬虫
- Python实现网络爬虫
- python实现网络爬虫
- python网络爬虫
- python实现网络爬虫
- Python 网络爬虫
- python网络爬虫
- python 网络爬虫 北京公交
- [Python] 实现网络爬虫
- python实现网络爬虫
- Python]网络爬虫
- Python实现网络爬虫
- python 网络爬虫
- 大话设计模式读书笔记(十) 建造者模式
- 推荐一款非常好看notepad++主题和字体
- 有关如何得到orcle数据库表结构的pdm文件
- 提高篇——统计字符串中每个小字母分别出现多少次?
- js方法执行中休眠几秒
- Python网络爬虫爬取虎扑步行街爆照区话题
- 配置window能ping通虚拟机的ubutu
- 【数据结构】图的存储--邻接矩阵
- Java面试题 01
- Python调用C/C++函数
- js基础运动样式
- JavaScript RegExp 对象的3 个方法:test()、exec() 和 compile()
- 自学小笔记(2017-4-16,HTML)
- 51 NOD 1135 原根