爬取时间:2019-10-12

爬取难度:★★☆☆☆☆

请求链接:https://bbs.hupu.com/bxj

爬取目标:爬取虎扑论坛步行街的帖子,包含主题,作者,发布时间等,数据保存到 MongoDB 数据库

涉及知识:请求库 requests、解析库 Beautiful Soup、数据库 MongoDB 的操作

完整代码:https://github.com/TRHX/Python3-Spider-Practice/tree/master/hupu

其他爬虫实战代码合集(持续更新):https://github.com/TRHX/Python3-Spider-Practice

爬虫实战专栏(持续更新):https://itrhx.blog.csdn.net/article/category/9351278

【1x00】循环爬取网页模块

观察虎扑论坛步行街分区,请求地址为:https://bbs.hupu.com/bxj

第一页:https://bbs.hupu.com/bxj

第二页:https://bbs.hupu.com/bxj-2

第三页:https://bbs.hupu.com/bxj-3

不难发现,每增加一页,只需要添加 -页数 参数即可,最后一页是第 50 页,因此可以利用 for 循环依次爬取,定义一个 get_pages() 函数,返回初始化 Beautiful Soup 的对象 page_soup,方便后面的解析函数调用

虽然一共有 50 页,但是当用户访问第 10 页以后的页面的时候,会要求登录虎扑,不然就没法查看,而且登录时会出现智能验证,所以程序只爬取前 10 页的数据

def get_pages(page_url):

headers = {

'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36'

}

response = requests.get(url=page_url, headers=headers)

page_soup = BeautifulSoup(response.text, 'lxml')

return page_soup

if __name__ == '__main__':

for i in range(1, 11):

url = 'https://bbs.hupu.com/bxj-' + str(i)

soup = get_pages(url)

【2x00】解析模块

使用 Beautiful Soup 对网页各个信息进行提取,最后将这些信息放进一个列表里,然后调用列表的 .append() 方法,再将每条帖子的列表依次加到另一个新列表里,最终返回的是类似于如下形式的列表:

[['帖子1', '作者1'], ['帖子2', '作者2'], ['帖子3', '作者3']]

这样做的目的是:方便 MongoDB 依次储存每一条帖子的信息

def parse_pages(page_soup):

data_list = []

all_list = page_soup.find('ul', class_='for-list')

post_list = all_list.find_all('li')

# print(result_list)

for post in post_list:

# 帖子名称

post_title = post.find('a', class_='truetit').text

# print(post_title)

# 帖子链接

post_url = 'https://bbs.hupu.com' + post.find('a', class_='truetit')['href']

# print(post_url)

# 作者

author = post.select('.author > a')[0].text

# print(author)

# 作者主页

author_url = post.select('.author > a')[0]['href']

# print(author_url)

# 发布日期

post_date = post.select('.author > a')[1].text

# print(post_date)

reply_view = post.find('span', class_='ansour').text

# 回复数

post_reply = reply_view.split('/')[0].strip()

# print(post_reply)

# 浏览量

post_view = reply_view.split('/')[1].strip()

# print(post_view)

# 最后回复时间

last_data = post.select('.endreply > a')[0].text

# print(last_data)

# 最后回复用户

last_user = post.select('.endreply > span')[0].text

# print(last_user)

data_list.append([post_title, post_url, author, author_url, post_date, post_reply, post_view, last_data, last_user])

# print(data_list)

return data_list

【3x00】MongoDB 数据储存模块

首先使用 MongoClient() 方法,向其传入地址参数 host 和 端口参数 port,指定数据库为 hupu,集合为 bxj

将解析函数返回的列表传入到储存函数,依次循环该列表,对每一条帖子的信息进行提取并储存

def mongodb(data_list):

client = MongoClient('localhost', 27017)

db = client.hupu

collection = db.bxj

for data in data_list:

bxj = {

'帖子名称': data[0],

'帖子链接': data[1],

'作者': data[2],

'作者主页': data[3],

'发布日期': str(data[4]),

'回复数': data[5],

'浏览量': data[6],

'最后回复时间': str(data[7]),

'最后回复用户': data[8]

}

collection.insert_one(bxj)

【4x00】完整代码

# =============================================

# --*-- coding: utf-8 --*--

# @Time : 2019-10-12

# @Author : TRHX

# @Blog : www.itrhx.com

# @CSDN : https://blog.csdn.net/qq_36759224

# @FileName: hupu.py

# @Software: PyCharm

# =============================================

import requests

import time

import random

from pymongo import MongoClient

from bs4 import BeautifulSoup

def get_pages(page_url):

headers = {

'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36'

}

response = requests.get(url=page_url, headers=headers)

page_soup = BeautifulSoup(response.text, 'lxml')

return page_soup

def parse_pages(page_soup):

data_list = []

all_list = page_soup.find('ul', class_='for-list')

post_list = all_list.find_all('li')

# print(result_list)

for post in post_list:

# 帖子名称

post_title = post.find('a', class_='truetit').text

# print(post_title)

# 帖子链接

post_url = 'https://bbs.hupu.com' + post.find('a', class_='truetit')['href']

# print(post_url)

# 作者

author = post.select('.author > a')[0].text

# print(author)

# 作者主页

author_url = post.select('.author > a')[0]['href']

# print(author_url)

# 发布日期

post_date = post.select('.author > a')[1].text

# print(post_date)

reply_view = post.find('span', class_='ansour').text

# 回复数

post_reply = reply_view.split('/')[0].strip()

# print(post_reply)

# 浏览量

post_view = reply_view.split('/')[1].strip()

# print(post_view)

# 最后回复时间

last_data = post.select('.endreply > a')[0].text

# print(last_data)

# 最后回复用户

last_user = post.select('.endreply > span')[0].text

# print(last_user)

data_list.append([post_title, post_url, author, author_url, post_date, post_reply, post_view, last_data, last_user])

# print(data_list)

return data_list

def mongodb(data_list):

client = MongoClient('localhost', 27017)

db = client.hupu

collection = db.bxj

for data in data_list:

bxj = {

'帖子名称': data[0],

'帖子链接': data[1],

'作者': data[2],

'作者主页': data[3],

'发布日期': str(data[4]),

'回复数': data[5],

'浏览量': data[6],

'最后回复时间': str(data[7]),

'最后回复用户': data[8]

}

collection.insert_one(bxj)

if __name__ == '__main__':

for i in range(1, 11):

url = 'https://bbs.hupu.com/bxj-' + str(i)

soup = get_pages(url)

result_list = parse_pages(soup)

mongodb(result_list)

print('第', i, '页数据爬取完毕!')

time.sleep(random.randint(3, 10))

print('前10页所有数据爬取完毕!')

【5x00】数据截图

一共爬取到 1180 条数据:

【6x00】程序不足的地方

程序只能爬取前 10 页的数据,因为虎扑论坛要求从第 11 页开始,必须登录账号才能查看,并且登录时会有智能验证,可以使用自动化测试工具 Selenium 模拟登录账号后再进行爬取。

python3论坛_Python3 爬虫实战 — 虎扑论坛步行街相关推荐

  1. Python3 爬虫实战 — 虎扑论坛步行街【requests、Beautiful Soup、MongoDB】

    爬取时间:2019-10-12 爬取难度:★★☆☆☆☆ 请求链接:https://bbs.hupu.com/bxj 爬取目标:爬取虎扑论坛步行街的帖子,包含主题,作者,发布时间等,数据保存到 Mong ...

  2. python爬虫(爬虎扑英雄联盟论坛)

    第十五讲 BeautifulSoup解析HTML标签 爬虫实战项目(英雄联盟虎扑论坛) import requests url = 'https://bbs.hupu.com/lol' headers ...

  3. 【Python爬虫】MongoDB爬虫实践:爬取虎扑论坛

    MongoDB爬虫实践:爬取虎扑论坛 网站地址为:https://bbs.hupu.com/bxj 1.网站分析 首先,定位网页上帖子名称.帖子链接.作者.作者链接.创建时间.回复数目.浏览数目.最后 ...

  4. 爬虫入门实践之爬取虎扑论坛帖子

    现在网络以及移动互联网发展迅速,大家花费越来越多的时间逛一些网站浏览帖子,比如贴吧.论坛等.博主喜欢打篮球,爱看NBA,因此常常行迹于虎扑论坛,看一些精彩赛事以及比较好的帖子.本文主要通过对虎扑某一版 ...

  5. 虎扑论坛爬虫采集数据可视化分析

    原文链接:http://tecdat.cn/?p=2018 论坛为用户提供了相同的业余爱好,互动和交流的广阔平台,以及由此产生的庞大数据和复杂的用户交互场景也包含有价值的信息,本文关于虎扑论坛的帖子, ...

  6. [python 爬虫]Python爬虫抓取虎扑论坛帖子图片

    自从可以实现抓取文字了,自然要尝试更多的类型,比如图片.我是一个有逛虎扑论坛习惯的人,经常会发现有些帖子的图片挺好看的想保存下来,但是如果人为保存的话,一个帖子至少都有二三十张,这将是一个庞大的工作量 ...

  7. python爬取虎扑论坛帖子数据

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取 python免费学习资 ...

  8. scrapy框架爬取虎扑论坛球队新闻

    目录 Scrapy 框架 制作 Scrapy 爬虫 一共需要4步: Scrapy的安装介绍 Windows 安装方式 一. 新建项目(scrapy startproject) 二.明确目标(mySpi ...

  9. (转)虎扑论坛基因探秘:社群用户行为数据洞察

    论坛为有相同爱好的网友提供了广阔的互动交流平台,而由此积累下来的庞大数据和复杂的用户互动场景也蕴含着有价值的信息,本文对虎扑论坛的帖子.个人信息展开分析,探索虎扑论坛用户有哪些特点? ▼ tecdat ...

最新文章

  1. JAVA-Socket通信笔记
  2. Java接收多台设备发送消息_FCM(Firebase Cloud 消息传递)发送到多个设备
  3. 调参神器贝叶斯优化(bayesian-optimization)实战篇
  4. 【Python植物大战僵尸军团来袭】“大家快醒一醒、一大波僵尸来了”
  5. 15个PHP库,你值得拥有!(下)
  6. C#异步编程看这篇就够了
  7. 从今天开始学习iOS开发(iOS 7版)-- 构建一款App之App开发过程 (二)
  8. OpenTSDB使用Grafana的Filters type注解
  9. npm 有用的一些全局包
  10. android ui设计最新字体,UI设计常用字体规范
  11. 【KEIL-MDK】系列——如何使用PC-Lint代码检查工具
  12. Linux 添加管理员用户
  13. php微信获取openid_PHP微信网页授权获取OPENID
  14. 网络封包分析软件-WildPackets OmniPeek Workgroup Pro
  15. level2行情接口十档行情快照如何去运用?
  16. OC中链式编程和函数式编程
  17. Python - 列表解析式( List_Comprehension)
  18. 【语音控制】0成本实现小爱远程开关电脑
  19. html表格图片右对齐,更好的方式在HTML表格中右对齐文本
  20. C# Windows 7任务栏开发之进度条(Progress Bar)

热门文章

  1. java 提高反射性能_java反射性能
  2. 1047: 对数表-python
  3. 全国计算机等级考试试题研究组,全国计算机等级考试题研究中心
  4. Python-Django毕业设计自行车租赁管理系统(程序+Lw)
  5. Xshell安装使用教程
  6. 图数据库JanusGraph介绍及使用(三):安装与初步使用
  7. 基于C#语言的一款录屏转GIF工具(C#源码)
  8. 【笔记】pdflatex和xelatex的使用差别和建议:前者适合对英文内容进行编译,后者适合对中文内容进行编译
  9. python爬取B站up主全部视频封面
  10. 单独编译和使用webrtc音频回声消除模块