设计类参考网站推荐,管理wordpress,青岛做网站费用,如何解决网站图片打开慢爬取时间#xff1a;2019-10-12爬取难度#xff1a;★★☆☆☆☆请求链接#xff1a;https://bbs.hupu.com/bxj爬取目标#xff1a;爬取虎扑论坛步行街的帖子#xff0c;包含主题#xff0c;作者#xff0c;发布时间等#xff0c;数据保存到 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(urlpage_url, headersheaders)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(urlpage_url, headersheaders)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 条数据 【6x00】程序不足的地方 程序只能爬取前 10 页的数据因为虎扑论坛要求从第 11 页开始必须登录账号才能查看并且登录时会有智能验证可以使用自动化测试工具 Selenium 模拟登录账号后再进行爬取。