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,一经查实,立即删除!

相关文章

Sharepoint页面里添加.net托管代码

Sharepoint页面里添加.net托管代码 在做Sharepoint门户网站定制时候,可以利用VS集成开发工具编写自定义功能的WebPart或利用VS在可视化环境下开发UserControl然后利用QuickPart用户控件包装器来将UserControl包装为WebPart,以这种方式来对Sharepoint门户…

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

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

SharePoint 编程指南(转)

网站相关的对象模型 作为一个应用原型系统,SharePoint提供了很多强大的应用及管理功能,但是,在实际的应用中,这些原有的功能很难满足用户的需求。因此,SharePoint也提供了一套非常完整的对象模型作为底层接口&#xf…

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)数据源和页面设计 域(元素)和域(属性)如下: 白色为域(元素),该类型的字段,发布时,提升成字段后,列表库的数据是…

【Python CheckiO 题解】All the Same

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

SharePoint学习札记[6] — WebPart之基础

Asp.net中的Web Part与MOSS中的Web Part有什么区别?WebPart怎么开发怎么部署? MOSS2007基础:Windows SharePoint Services 3.0中的Web Part [Sunmoonfire撰写] MOSS2007基础:开发自定义WebPart [Sunmoonfire撰写] MOSS2007基础…

【Python CheckiO 题解】House Password

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

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

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

【Python CheckiO 题解】The Most Wanted Letter

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

SharePoint学习札记[1] — WSS与MOSS的关系

Windows SharePoint Services 是一个用来创建能够实现信息共享和文档协作的Web站点的引擎,从而有助于提高个人和团队的生产力。它是Microsoft Windows Server™ 2003中所提供的信息工作者体系结构的重要组成部分, 为Microsoft Office System和其他的桌面应用程序提供…

【Python CheckiO 题解】Time Converter (24h to 12h)

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

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

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

【Python CheckiO 题解】Non-unique Elements

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

【Python CheckiO 题解】Sort Array by Element Frequency

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

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

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

【Python CheckiO 题解】Flatten a List

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

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

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