欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

虎扑步行街爬虫分析

程序员文章站 2022-06-10 14:02:51
...

最近学习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

这里要特意说一下,这个爬虫是我业余时间写的,没做过什么仔细的测试,所以不保证上面数据是对的,也不保证程序没有什么问题。总之,纯属娱乐,大家有兴趣可以玩玩