虎扑步行街爬虫分析
最近学习scrapy,就拿虎扑练了下手,主要爬取虎扑步行街的帖子以及回帖的一些数据。
scrapy的教程可以看一下我写的上一篇博客:
python爬虫框架——Scrapy架构原理介绍
解析网页的时候还需要对xpath有所了解,也可以看一下我的这篇博客:
xPath 用法总结整理
一、爬虫功能
目前主要就实现3个功能:
1. 爬取步行街主干道的帖子
2. 爬取对应帖子的回帖信息
3. 爬取步行街上的所有图片,下载到本地(可通过配置文件开关,默认是关闭的)
下面简单分析一下爬取过程
二、抓取数据过程简单分析
开始爬取的时候,我们可以先分析步行街的首页url https://bbs.hupu.com/bxj,然后用chrome的开发者工具对网页的html进行分析。对于一些感兴趣的数据,分析它html节点对应的xpath语法。如果对html以及xpath不太熟悉的同学,也可以使用chrome开发者工具直接抽取xpath。
选中元素,然后右击
拿到对应的xpath后,我们就可以获取数据了。下面是对应parse()
的方法:
def parse(self, response):
content_urls = []
# 获取所有帖子,然后去遍历他们
for li in response.xpath('//ul[@class="for-list"]/li'):
# self.log(li.extract())
# 获取标题的链接
title_href = li.xpath(".//a[@class='truetit']/@href").extract_first()
# 上面拿到的只是一个相对地址,这里拼接成一个绝对地址
url = "https://bbs.hupu.com" + title_href
# 虎扑帖子的id
post_id = self.get_post_id(title_href)
# 获取帖子的标题
title = li.xpath(".//a[@class='truetit']/text()").extract_first()
# 作者
author = li.xpath(".//a[@class='aulink']/text()").extract_first()
# 发表时间
post_time = li.xpath(".//a[@style='color:#808080;cursor: initial; ']/text()").extract_first()
# 获取浏览数/回复数
count_des = li.xpath(".//span[@class='ansour box']/text()").extract_first()
# 获取回复数
reply_count = re.match('(\d+)[^0-9]*(\d+)', count_des).group(1)
# 获取帖子浏览数
view_count = re.match('(\d+)[^0-9]*(\d+)', count_des).group(2)
content_urls.append(url)
# 返回数据,交给pipeline去存储到数据库中
yield {"id": post_id, "title": title, "url": url, "author": author, "post_time": post_time,
"view_count": view_count, "reply_count": reply_count}
# 这下面返回帖子的url,这样scrapy引擎就会继续去查看帖子的详情,后面就可以直接爬取帖子的回帖数据了
for content_url in content_urls:
yield scrapy.Request(content_url, self.post_content_parse, dont_filter=True)
这样,我们就获取到步行街首页的所有帖子内容,要想获取第二页的数据也很简单,虎扑的分页是直接放在url上做处理的。要访问第二页,在后面加个-2就可以了,也就是https://bbs.hupu.com/bxj-2。我们就可以很方便的遍历各个页面的帖子数据了。
获取回帖数据
拿到帖子数据后,我们还希望拿到对应的帖子回帖详情,在前面的parse()
方法里面,我们已经在最后返回了包含帖子url的Request,scrapy引擎会自动帮我们去下载对应url的内容,然后调用post_content_parse()
方法。怎么获取回帖内容就不详细分析了,下面直接上代码:
def post_content_parse(self, response):
# 获取一共有几页
page_match = self.page_compile.match(response.text)
total_pages = 1
if page_match is not None:
total_pages = int(page_match.group(1))
# 获取帖子的内容
content = response.xpath("//div[@class='quote-content']").extract_first()
# 帖子的具体回复时间,前面获取的时间值精确到天,这里的可以精确到秒
post_detail_time = response.xpath("//div[@class='floor-show']//span[@class='stime']/text()").extract_first()
post_id = self.get_post_id(response.url)
# 这里返回帖子的内容和具体时间主要是为了修复前面的帖子数据
yield {"type": 2, "content": content, "post_time": post_detailt_time, "id": post_id}
# 遍历所有回帖楼层
for reply in response.xpath("//div[@class='floor']"):
if reply.xpath("@id") is None:
continue
hupu_reply_id = reply.xpath("@id").extract_first()
floor_num = reply.xpath(".//a[@class='floornum']/@id").extract_first()
if hupu_reply_id == "tpc" or floor_num is None:
continue
author = reply.xpath(".//div[@class='author']//a[@class='u']/text()").extract_first()
reply_time = reply.xpath(".//div[@class='author']//span[@class='stime']/text()").extract_first()
like_count = reply.xpath(
".//div[@class='author']//span[@class='ilike_icon_list']//span[@class='stime']/text()").extract_first()
content = reply.xpath(".//tbody").extract_first()
yield {"type": 3, "content": content, "hupu_reply_id": hupu_reply_id, "author": author,
"hupu_post_id": post_id, "reply_time": reply_time, "like_count": like_count, "floor_num": floor_num}
# 如果回帖的页数大于1,还需要继续遍历其他页的回帖数据
if total_pages > 1:
for page in range(2, total_pages + 1):
url = "https://bbs.hupu.com/%s-%s.html" % (post_id, page)
scrapy.Request(url, self.post_content_page_parse, dont_filter=True)
# 用来抽取本页面所有的图片内容
image_urls = response.xpath("//tbody//img/@src").extract()
if len(image_urls) > 0:
yield {"type": 999, "image_urls": image_urls}
下载图片
上面爬取回帖内容的同时,还同时爬取了图片的url。本人也写了一个pipeline来处理这些图片url,功能很简单,就是直接把图片下载下来,不过默认情况下这个pipeline是关闭的。
三、步行街帖子数据分析
目前爬虫已经放到服务器上面运行,从6月12号开始,也累计了一些数据。下面对帖子以及回帖数据进行一些简单的分析:
1. 日发帖数
日期 | 数量 |
---|---|
2018-06-12 | 3194 |
2018-06-13 | 2692 |
2018-06-14 | 2494 |
2018-06-15 | 2191 |
2018-06-16 | 1705 |
2018-06-17 | 1793 |
2018-06-18 | 1980 |
2018-06-19 | 2051 |
2018-06-20 | 1903 |
2018-06-21 | 1991 |
2018-06-22 | 1905 |
2018-06-23 | 536 |
从上面的表格可以看出,步行街的日发帖数应该在2000左右,不知道为什么6.12到6.14这几天为什么比较高,当然不排除我的爬虫程序有问题。
2. 日回帖数
日期 | 数量 |
---|---|
2018-06-12 | 49819 |
2018-06-13 | 37125 |
2018-06-14 | 30570 |
2018-06-15 | 25295 |
2018-06-16 | 18054 |
2018-06-17 | 19039 |
2018-06-18 | 19483 |
2018-06-19 | 20593 |
2018-06-20 | 18449 |
2018-06-21 | 18928 |
2018-06-22 | 16177 |
2018-06-23 | 4858 |
发帖数差不多是2000,回帖数量是20000,有点意思。还是6.12到6.14比较高
4. 发帖数最高的50名jr
在6.12到6.23之间,发帖数最高的50名jr:
jr账号名 | 发帖数量 |
---|---|
天雷刚地火 | 96 |
雨1直下 | 89 |
路人王 | 53 |
太阳骑士索拉尔哟 | 47 |
方敏寞 | 46 |
彩虹上面看星星 | 46 |
哈哈哈侦探社 | 44 |
yintongju | 41 |
成长中的迷茫与彷徨 | 39 |
木守宫 | 38 |
勒布朗FMVP詹姆斯 | 38 |
PH217 | 35 |
笨笨虫和牛仔 | 34 |
劍魔獨孤求敗 | 33 |
小毛驴林书豪 | 33 |
junwangce | 33 |
步行街最帅的男人 | 33 |
TomDavies | 31 |
呼呼zzzzzz | 31 |
鲁智深大战潘金莲 | 29 |
章泽天男友 | 27 |
姨妈血豆腐汤 | 27 |
随心所欲不 | 27 |
Chuck正男 | 26 |
虎扑中人 | 25 |
moneya | 25 |
SmithKobe | 25 |
嗨喽棒棒昂 | 25 |
早上尿很黄 | 25 |
卡特麦迪AI科比鲨鱼 | 25 |
作死就只能用小号 | 25 |
人云亦云者比无脑可悲 | 25 |
LCMC0710 | 25 |
佛陀芒果 | 24 |
文墨冷潇 | 23 |
破體無形劍氣 | 22 |
后仰直臂投 | 22 |
我有点晕奶 | 21 |
第十九个号 | 21 |
绿胖腿 | 21 |
w13955386654 | 21 |
大王威武 | 21 |
胡乱唱歌96 | 21 |
齐B裤小号 | 20 |
灯泡最牛 | 20 |
上纸寨 | 20 |
世界杯MVP梅西 | 20 |
175327777 | 19 |
小勒布朗三分绝杀老詹 | 19 |
安兜兜hd | 19 |
4. 回帖数最高的50名jr
在6.12到6.23之间,回帖数最高的50名jr:
jr账号名 | 回帖数量 |
---|---|
水水瑞 | 1538 |
mihm3344 | 405 |
21DuncanSun | 376 |
不愿透露姓名的某JR | 349 |
金牛座万大爷 | 346 |
那你自个儿想去 | 346 |
浮云310 | 318 |
外行看门道MAC | 311 |
千年以后子孙留名 | 273 |
Harry郝艺益 | 269 |
活的真累 | 257 |
张啊花 | 255 |
行风666 | 252 |
左韩超右 | 250 |
游荡的泉 | 230 |
ms_king | 229 |
轩寻6 | 226 |
dabing2016 | 223 |
elgin1234 | 213 |
逼格east | 208 |
流年‰飘雪 | 207 |
安徽亳州 | 205 |
晚归来 | 203 |
Kobe_is_FMVP | 200 |
范蕊雅单挑库里 | 199 |
我的包包不能这么可爱 | 197 |
rogerfwoo | 191 |
哈保卡 | 190 |
15850000 | 186 |
红焙浅瓯 | 184 |
Laughing.哥 | 183 |
戈多樱木 | 183 |
真范德彪 | 183 |
表白标配士力架 | 181 |
篮球队的小田 | 181 |
手可摘星辰i | 181 |
哈灯的登 | 179 |
香甜好米饭 | 178 |
能没昵称吗行不 | 176 |
红花会陈家洛 | 173 |
三星NOTE8 | 170 |
东篱下的你 | 169 |
hangload | 164 |
小树宝的大草包 | 159 |
沐芋枫 | 157 |
感性的Augus | 157 |
我相信琦迹 | 155 |
两米二大老黑 | 155 |
挣钱换X5 | 154 |
小穴老湿啊 | 153 |
5. 查看某天回复数最高的50个帖子
有时候没空刷步行街,就可以把当天回帖最多的那些帖子找出来看一看。一般回帖多的帖子都比较有趣,很多时候看回帖比看帖子还有意思。
6.21那天回复数量最高的50个帖子:
标题 | 链接 | 浏览数 | 回复数 | 发帖时间 |
---|---|---|---|---|
你对自己的身高满意吗?距离想身高差多少? | https://bbs.hupu.com/22653031.html | 380755 | 1551 | 2018-06-21 07:28:00 |
对你影响最大的一本书是什么? | https://bbs.hupu.com/22658135.html | 394914 | 1193 | 2018-06-21 16:20:00 |
我是上次小区踢飞泰迪的那个,后续来了 | https://bbs.hupu.com/22657245.html | 823999 | 1159 | 2018-06-21 14:56:00 |
今天看到几年前居然有人说江南大学是野鸡大学 | https://bbs.hupu.com/22653084.html | 348088 | 897 | 2018-06-21 07:42:00 |
陕北小县城人第一次来大城市省城西安,被震撼到了。。。 | https://bbs.hupu.com/22652204.html | 366892 | 877 | 2018-06-21 00:35:00 |
你穿过最舒服的低帮篮球鞋是哪双? | https://bbs.hupu.com/22661382.html | 380934 | 875 | 2018-06-21 21:53:00 |
zt 最新消息,江苏高考取消小高考,语数外改用全国卷 | https://bbs.hupu.com/22652847.html | 379259 | 870 | 2018-06-21 05:07:00 |
男生是不是真的更容易从失恋中走出来? | https://bbs.hupu.com/22661015.html | 357281 | 865 | 2018-06-21 21:20:00 |
上海财经大学还是听父母意见去西安交通大学? | https://bbs.hupu.com/22655054.html | 335541 | 852 | 2018-06-21 11:21:00 |
终于轮到我了,我是《古惑仔》编剧文隽,大家有什么想问的? | https://bbs.hupu.com/22656567.html | 265841 | 771 | 2018-06-21 13:48:00 |
广东23岁女子凌晨打车遭侵犯杀害 被藏尸烧烤店冰柜zt | https://bbs.hupu.com/22653415.html | 749287 | 767 | 2018-06-21 08:41:00 |
复旦大学生在邓紫棋面前炫耀学历,被撒贝宁无情打脸,什么水平?zt | https://bbs.hupu.com/22657173.html | 743862 | 755 | 2018-06-21 14:50:00 |
不看抖音,不看快手,不看小视频,不玩王者,不吃鸡的是什么样的男人? | https://bbs.hupu.com/22658047.html | 269902 | 746 | 2018-06-21 16:12:00 |
无助,女朋友情愿分手也要做主播 | https://bbs.hupu.com/22660404.html | 564589 | 691 | 2018-06-21 20:24:00 |
28岁还喜欢玩游戏,是不是不成熟的表现? | https://bbs.hupu.com/22654920.html | 435483 | 663 | 2018-06-21 11:08:00 |
同事动不动就说世界杯踢假球,问问街上看球的jr,是同事太偏激还是世界杯真的这样 | https://bbs.hupu.com/22653725.html | 327633 | 653 | 2018-06-21 09:18:00 |
我前面自习的妹子衣服好像反了…我该怎么提醒她 | https://bbs.hupu.com/22657871.html | 1086467 | 633 | 2018-06-21 15:54:00 |
现在女孩子写字普遍比男生写字好看? | https://bbs.hupu.com/22653236.html | 255973 | 618 | 2018-06-21 08:17:00 |
阿迪boost穿着舒服吗? | https://bbs.hupu.com/22653173.html | 297150 | 597 | 2018-06-21 08:06:00 |
你们反感别人吃饭bia叽嘴吗 | https://bbs.hupu.com/22655719.html | 189510 | 591 | 2018-06-21 12:26:00 |
你管外祖母叫外婆还是姥姥? | https://bbs.hupu.com/22655772.html | 53460 | 581 | 2018-06-21 12:32:00 |
明天就要人生第一次一个人坐飞机了,为了不尴尬,有哪些要注意的? | https://bbs.hupu.com/22653154.html | 338257 | 570 | 2018-06-21 08:02:00 |
身边有个小姐姐 快30了职业是空姐,听说还没谈过男朋友 正常吗? | https://bbs.hupu.com/22657929.html | 594876 | 562 | 2018-06-21 16:01:00 |
西安综合实力和郑州相比落后吗? | https://bbs.hupu.com/22655953.html | 96447 | 561 | 2018-06-21 12:47:00 |
火车对面一个1米8的妹子,现在我们两个面对面坐着,很尴尬 | https://bbs.hupu.com/22659812.html | 1100467 | 553 | 2018-06-21 19:26:00 |
说到歌曲刚开始高潮的歌你第一个想到的是哪首? | https://bbs.hupu.com/22660877.html | 142950 | 542 | 2018-06-21 21:07:00 |
昨晚和老婆的聊天记录,我是修了几辈子的福气? | https://bbs.hupu.com/22653013.html | 731883 | 530 | 2018-06-21 07:21:00 |
我大河南的高考真恐怖 | https://bbs.hupu.com/22653468.html | 126669 | 527 | 2018-06-21 08:50:00 |
爷爷破过的奇案4:中心校空屋悬尸疑案(多图慎入) | https://bbs.hupu.com/22654485.html | 446857 | 511 | 2018-06-21 10:33:00 |
张艺兴在国外有多火 | https://bbs.hupu.com/22657470.html | 232204 | 510 | 2018-06-21 15:17:00 |
袁立这波怒怼李冰冰什么水平 | https://bbs.hupu.com/22654535.html | 839503 | 503 | 2018-06-21 10:36:00 |
13岁孩子路上突发心脏病猝死 无人现场急救,律师:好心帮助可能需承担法律责任。 | https://bbs.hupu.com/22656565.html | 241227 | 502 | 2018-06-21 13:47:00 |
女票在大学里有两个认的哥哥是什么意思? | https://bbs.hupu.com/22655277.html | 326411 | 492 | 2018-06-21 11:44:00 |
Angelababy实力说唱,嗨翻全场! | https://bbs.hupu.com/22661522.html | 519914 | 470 | 2018-06-21 22:09:00 |
2018年各国人均纯收入排行榜,日本挤出前20,中国香港入围 | https://bbs.hupu.com/22656702.html | 246416 | 464 | 2018-06-21 14:01:00 |
一个小学同学来我姐姐店吃饭,不给免单有错吗? | https://bbs.hupu.com/22654663.html | 407392 | 463 | 2018-06-21 10:47:00 |
ZT河南一街道规定彩礼不得超2万 索要过多以贩卖人口论处 | https://bbs.hupu.com/22653673.html | 323144 | 455 | 2018-06-21 09:14:00 |
王晶这个微博怎么看 | https://bbs.hupu.com/22653809.html | 493515 | 455 | 2018-06-21 09:27:00 |
作为矿泉水的两大巨头 你们选哇哈哈还是农夫山泉 | https://bbs.hupu.com/22656890.html | 138999 | 454 | 2018-06-21 14:22:00 |
女子当街掌掴母亲引众怒,遭路人一脚踹飞 | https://bbs.hupu.com/22659622.html | 454294 | 445 | 2018-06-21 19:03:00 |
什么水平?面对强拆,住户把城管、物业和社区工作人员说得哑口无言! | https://bbs.hupu.com/22660161.html | 227668 | 434 | 2018-06-21 20:01:00 |
大四鞋被偷了再次后续… | https://bbs.hupu.com/22652718.html | 205755 | 424 | 2018-06-21 03:29:00 |
蝴蝶效应在历史长河中真的会有改变历史轨迹的影响吗? | https://bbs.hupu.com/22653259.html | 318196 | 410 | 2018-06-21 08:20:00 |
这也太猛了吧。。。 | https://bbs.hupu.com/22655765.html | 473127 | 409 | 2018-06-21 12:31:00 |
你信有的女人27岁了还是处女,而且之前没有谈过恋爱吗? | https://bbs.hupu.com/22655342.html | 208556 | 399 | 2018-06-21 11:52:00 |
被一个很漂亮的女生告白 怎么办 | https://bbs.hupu.com/22662055.html | 630870 | 397 | 2018-06-21 22:53:00 |
有没有恋爱的感觉,台妹都这么可爱的么? | https://bbs.hupu.com/22659504.html | 353328 | 397 | 2018-06-21 18:49:00 |
堂哥放弃了副处岗位的引进生公务员,大伯觉得很丢人 | https://bbs.hupu.com/22656826.html | 164237 | 394 | 2018-06-21 14:16:00 |
Jrs,年收入十五万,到底属于什么水平 | https://bbs.hupu.com/22656757.html | 107860 | 385 | 2018-06-21 14:07:00 |
“外公外婆”竟成方言,教材被改以后上海人也要跟着叫姥姥了吗? | https://bbs.hupu.com/22653651.html | 69960 | 366 | 2018-06-21 09:12:00 |
目前就列这些维度的数据分析,有兴趣的朋友可以联系我,我有空的话可以给你们提供更详细的数据。
四、源码分享以及后期开发
目前这个爬虫我已经开源到了github上面,欢迎大家star甚至加入一起开发,后面如果有时间可能还要加一些功能爬取更多的内容,甚至开发一个网站实时展示这些数据。下面附上github地址:
https://github.com/kongtrio/hupu_spider
这里要特意说一下,这个爬虫是我业余时间写的,没做过什么仔细的测试,所以不保证上面数据是对的,也不保证程序没有什么问题。总之,纯属娱乐,大家有兴趣可以玩玩
上一篇: Session
下一篇: 简略介绍 Java 引用类型