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


  • 爬取时间:2019-10-12
  • 爬取难度:★★☆☆☆☆
  • 请求链接:https://bbs.hupu.com/bxj
  • 爬取目标:爬取虎扑论坛步行街的帖子,包含主题,作者,发布时间等,数据保存到 MongoDB 数据库
  • 涉及知识:请求库 requests、解析库 Beautiful Soup、数据库 MongoDB 的操作
  • 完整代码:https://github.com/TRHX/Python3-Spider-Practice/tree/master/BasicTraining/hupu
  • 其他爬虫实战代码合集(持续更新):https://github.com/TRHX/Python3-Spider-Practice
  • 爬虫实战专栏(持续更新):https://itrhx.blog.csdn.net/article/category/9351278

文章目录

  • 【1x00】循环爬取网页模块
  • 【2x00】解析模块
  • 【3x00】MongoDB 数据储存模块
  • 【4x00】完整代码
  • 【5x00】数据截图
  • 【6x00】程序不足的地方


【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_soupif __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.hupucollection = db.bxjfor 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 BeautifulSoupdef 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_soupdef 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_listdef mongodb(data_list):client = MongoClient('localhost', 27017)db = client.hupucollection = db.bxjfor 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 条数据:
01

【6x00】程序不足的地方

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/437897.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python3 爬虫实战 — 模拟登陆哔哩哔哩【滑动验证码对抗】

登陆时间:2019-10-21实现难度:★★★☆☆☆请求链接:https://passport.bilibili.com/login实现目标:模拟登陆哔哩哔哩,攻克滑动验证码涉及知识:滑动验证码的攻克、自动化测试工具 Selenium 的使用完整代码&…

Python3 爬虫实战 — 模拟登陆12306【点触验证码对抗】

登陆时间:2019-10-21实现难度:★★★☆☆☆请求链接:https://kyfw.12306.cn/otn/resources/login.html实现目标:模拟登陆中国铁路12306,攻克点触验证码涉及知识:点触验证码的攻克、自动化测试工具 Selenium…

SharePoint无代码工作流设计开发实例——交通费报销流程(一)

开发环境: (1)SharePoint Designer 2010 (2)SharePoint Online(Office 365) 关于Office 365和SharePoint Online的相关信息请参见以下链接 http://blog.csdn.net/miragesky2049/article/details/7242982 1、需求分析 组织结构: 用户类型&#xff1a…

Python3 爬虫实战 — 58同城武汉出租房【加密字体对抗】

爬取时间:2019-10-21爬取难度:★★★☆☆☆请求链接:https://wh.58.com/chuzu/爬取目标:58同城武汉出租房的所有信息涉及知识:网站加密字体的攻克、请求库 requests、解析库 Beautiful Soup、数据库 MySQL 的操作完整代…

SharePoint无代码工作流设计开发实例——交通费报销流程(二)

3、InfoPath表单的设计及发布 (1)数据源和页面设计 域(元素)和域(属性)如下: 白色为域(元素),该类型的字段,发布时,提升成字段后,列表库的数据是…

SharePoint无代码工作流设计开发实例——交通费报销流程(三)

4、SharePoint Designer无代码工作流的设计 开发工具为SharePoint Designer 2010 新建“列表工作流”,绑定“交通费报销单”表单库 设置工作流启动选项“创建项目时自动启动工作流” 编辑工作流 (关于以下工作流详细设计可参考http://blog.csdn.net/mi…

SharePoint学习札记[2] — MOSS2007体系结构概述

熟悉微软Office产品线的人都知道,MOSS 2007的上一个版本SPS 2003的全称是 Office Sharepoint Portal Server,在新版本中,微软去掉了Portal一个词。从这个角度很清楚地看到微软对MOSS 2007的定位,是的,MOSS 已经不再仅仅…

SharePoint学习札记[3] — Office SharePoint Server 2007部署

MOSS的第一步就是部署啦!《0ffice SharePoint Server 2007部署图示指南》图文并茂的展示了OSS2007的部署过程。虽然并不难,但对MOSS还摸不清方向的人来说是个不错的指导。手册的作者没有署名,也查不到出自谁手,在这里对他的劳动成果表示感谢…

SharePoint学习札记[4] — 创建SharePoint站点

为减少创建SharePoint站点过程中的麻烦,先打开IIS管理器,将“默认站点”停止或删除。后面的创建过程中,创建向导会自动创建端口为80的网站。 现在将: 1. 创建两个Web应用程序。 2. 创建共享服务。 3. 创建…

【Python CheckiO 题解】Sun Angle

CheckiO 是面向初学者和高级程序员的编码游戏,使用 Python 和 JavaScript 解决棘手的挑战和有趣的任务,从而提高你的编码技能,本博客主要记录自己用 Python 在闯关时的做题思路和实现代码,同时也学习学习其他大神写的代码。 Chec…

Python CheckiO 题解系列 丨 博客目录索引

CheckiO 是面向初学者和高级程序员的编码游戏,使用 Python 和 JavaScript 解决棘手的挑战和有趣的任务,从而提高你的编码技能,本题解系列主要记录自己在用 Python 闯关时的做题思路和实现代码,同时也学习学习其他大神写的代码。 …

文带你深入了解 Redis 内存模型

前言 Redis是目前最火爆的内存数据库之一,通过在内存中读写数据,大大提高了读写速度,可以说Redis是实现网站高并发不可或缺的一部分。 我们使用Redis时,会接触Redis的5种对象类型(字符串、哈希、列表、集合、有序集合…

【Python CheckiO 题解】Pawn Brotherhood

CheckiO 是面向初学者和高级程序员的编码游戏,使用 Python 和 JavaScript 解决棘手的挑战和有趣的任务,从而提高你的编码技能,本博客主要记录自己用 Python 在闯关时的做题思路和实现代码,同时也学习学习其他大神写的代码。 Chec…

【Python CheckiO 题解】Xs and Os Referee

CheckiO 是面向初学者和高级程序员的编码游戏,使用 Python 和 JavaScript 解决棘手的挑战和有趣的任务,从而提高你的编码技能,本博客主要记录自己用 Python 在闯关时的做题思路和实现代码,同时也学习学习其他大神写的代码。 Chec…

c#多线程总结(纯干货)

线程基础 创建线程 static void Main(string[] args) {Thread t new Thread(PrintNumbers);t.Start();//线程开始执行PrintNumbers();Console.ReadKey(); }static void PrintNumbers() {Console.WriteLine("Starting...");for (int i 1; i < 10; i){Console.Wr…

Hexo 博客优化之实用功能添加系列(持续更新)

2022-01-25 更新&#xff1a;博客新地址&#xff1a;https://www.itbob.cn/&#xff0c;文章距上次编辑时间较远&#xff0c;部分内容可能已经过时&#xff01; 本文将讲述一些 Hexo 博客实用功能的添加&#xff0c;本文以作者 luuman 的 spfk 主题和作者 xaoxuu 的 Material X…

【Python CheckiO 题解】The Warriors

CheckiO 是面向初学者和高级程序员的编码游戏&#xff0c;使用 Python 和 JavaScript 解决棘手的挑战和有趣的任务&#xff0c;从而提高你的编码技能&#xff0c;本博客主要记录自己用 Python 在闯关时的做题思路和实现代码&#xff0c;同时也学习学习其他大神写的代码。 Chec…

【Python CheckiO 题解】Multiply (Intro)

CheckiO 是面向初学者和高级程序员的编码游戏&#xff0c;使用 Python 和 JavaScript 解决棘手的挑战和有趣的任务&#xff0c;从而提高你的编码技能&#xff0c;本博客主要记录自己用 Python 在闯关时的做题思路和实现代码&#xff0c;同时也学习学习其他大神写的代码。 Chec…

关于DateTime的一点记录 ToString(yyyy-MM-dd HH:mm:ss)

DateTime dt DateTime.Now; string z dt.ToString("yyyy-MM-dd HH:mm:ss");//你知道这个是“年月日时分秒”的格式吧? string a dt.ToString("yyyy-MM-dd HH:mm:ss ms");//这个你认为一定是 毫秒的格式? string b dt.ToString("yyyy-MM-dd HH:…

SharePoint List item数量超过5000的解决办法

SharePoint一个list里面的item数量超过5000会提示“视图无法显示&#xff0c;因为超过管理员限制设定的列表视图阈值” 在CSDN里面有比较好的解决方案&#xff0c;在这里先记录下来&#xff0c;以后有用 方案一&#xff0c;定期自动归档 不用写TimerJOb&#xff0c; 可以用cont…