python爬取网页并保存在mongodb中

python爬取网页并保存在mongodb中

MongoDB简介

MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。

MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。

基本概念

(1)文档

文档是 MongoDB 中数据的基本单位,类似于关系数据库中的行(但是比行复杂)。多个键及其关联的值有序地放在一起就构成了文档。不同的编程语言对文档的表示方法不同,在JavaScript 中文档表示为:
{“greeting”:“hello,world”}
这个文档只有一个键“greeting”,对应的值为“hello,world”。多数情况下,文档比这个更复杂,它包含多个键/值对。例如:
{“greeting”:“hello,world”,“foo”: 3}
文档中的键/值对是有序的,下面的文档与上面的文档是完全不同的两个文档。
{“foo”: 3 ,“greeting”:“hello,world”}
文档中的值不仅可以是双引号中的字符串,也可以是其他的数据类型,例如,整型、布尔型等,也可以是另外一个文档,即文档可以嵌套。文档中的键类型只能是字符串。需要注意的是:

  1. 文档中的键/值对是有序的。
  2. 文档中的值不仅可以是在双引号里面的字符串,还可以是其他几种数据类型(甚至可以是整个嵌入的文档)。
  3. MongoDB区分类型和大小写。
  4. MongoDB的文档不能有重复的键。
  5. 文档的键是字符串。除了少数例外情况,键可以使用任意UTF-8字符。
    文档键命名规范:
    • 键不能含有\0 (空字符)。这个字符用来表示键的结尾。
    • .和$有特别的意义,只有在特定环境下才能使用。
    • 以下划线"_"开头的键是保留的(不是严格要求的)。

(2)集合

集合就是一组文档,类似于关系数据库中的表。集合是无模式的,集合中的文档可以是各式各样的。例如,{“hello,word”:“Mike”}和{“foo”: 3},它们的键不同,值的类型也不同,但是它们可以存放在同一个集合中,也就是不同模式的文档都可以放在同一个集合中。既然集合中可以存放任何类型的文档,那么为什么还需要使用多个集合?这是因为所有文档都放在同一个集合中,无论对于开发者还是管理员,都很难对集合进行管理,而且这种情形下,对集合的查询等操作效率都不高。所以在实际使用中,往往将文档分类存放在不同的集合中,例如,对于网站的日志记录,可以根据日志的级别进行存储,Info级别日志存放在Info 集合中,Debug 级别日志存放在Debug 集合中,这样既方便了管理,也提供了查询性能。但是需要注意的是,这种对文档进行划分来分别存储并不是MongoDB 的强制要求,用户可以灵活选择。

(3)数据库

MongoDB 中多个文档组成集合,多个集合组成数据库。一个MongoDB 实例可以承载多个数据库。它们之间可以看作相互独立,每个数据库都有独立的权限控制。在磁盘上,不同的数据库存放在不同的文件中。MongoDB 中存在以下系统数据库。
● Admin 数据库:一个权限数据库,如果创建用户的时候将该用户添加到admin 数据库中,那么该用户就自动继承了所有数据库的权限。
● Local 数据库:这个数据库永远不会被复制,可以用来存储本地单台服务器的任意集合。
● Config 数据库:当MongoDB 使用分片模式时,config 数据库在内部使用,用于保存分片的信息。

由于mongodb是文档型数据库,区别于传统的数据库,它是用来管理文档的。在传统的数据库中,信息被分割成离散的数据段,而在文档数据库中,文档是处理信息的基本单位。一个文档可以很长、很复杂、可以无结构,与字处理文档类似。一个文档相当于关系数据库中的一条记录。
文档存储一般用类似json的格式存储,存储的内容是文档型的。这样也就有机会对某些字段建立索引,实现关系数据库的某些功能。
MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。

MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。
因此我们可以很方便的将网页用MongoDB保存下来。
这里爬取的是深圳市规划和自然资源局的公示
在这里插入图片描述
源码:
这里参考了其他的博主,每一行基本都写了注释方便理解

import requests	#requests是一个很实用的Python HTTP客户端库,编写爬虫和测试服务器响应数据时经常会用到。
import re		#正则表达式(要从网页代码里面提取特定的标签里面的内容)
from lxml import etree	
#lxml:python 的HTML/XML的解析器,
  • 4
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以使用Python编程语言来爬取微博热搜,并将数据保存MongoDB数据。 具体步骤如下: 1. 安装PythonMongoDB,并安装相应的Python库:pymongo、requests、beautifulsoup4。 2. 使用requests库发送HTTP请求,获取微博热搜页面的HTML代码。 3. 使用beautifulsoup4库解析HTML代码,提取出热搜榜单的信息。 4. 使用pymongo库连接MongoDB数据库,并将热搜榜单的信息保存数据。 需要注意的是,爬取微博热搜需要模拟登录,否则只能获取到部分数据。可以使用selenium库模拟登录,或者使用微博开放平台的API接口来获取数据。 ### 回答2: 爬取微博热搜并保存MongoDB的过程可以分为以下几个步骤: 1. 确定爬虫目标 我们的爬虫目标是微博热搜,因此需要先了解微博热搜的网页结构和信息获取方法。打开微博热搜页面,可以看到列表包含了许多热门话题,每个话题都有对应的排名、热度和链接地址等信息。这些信息是我们要收集和保存数据。 2. 分析网页结构和获取数据的方法 接下来需要通过分析热搜页面的HTML代码,确定我们需要获取哪些数据和如何获取这些数据。以Chrome浏览器为例,可以通过右键选择“检查”来打开开发者工具,然后在Elements选项卡查看HTML代码。可以看到每个热搜话题都包含在一个class为'card'的标签,而该标签下包含了类似下面这样的信息: <div class="card-wrap"> <div class="card-top"> <a href="/weibo?q=%23%E5%A4%A7%E5%98%B4%E9%A3%9E%E8%BD%A6%23&Refer=weibo_card" target="_blank"> <div class="hot"> <span class="line-gradient"></span> <span class="icon-txt">2.6万</span> </div> <div class="title"> <p>#大嘴飞车#</p> </div> </a> </div> <div class="card-content"> <p class="card-txt">#大嘴飞车#剧情重磅!小鹏车队CEO被黑了!你们的神秘大人出现了,眼熟吗?</p> <div class="card-btn"> <a href="/weibo?q=%23%E5%A4%A7%E5%98%B4%E9%A3%9E%E8%BD%A6%23&Refer=weibo_card" target="_blank"> <span class="ico-txt">微博热搜</span> </a> </div> </div> </div> 我们需要获取的数据包括热搜排名、标题、热度、链接地址和相关描述等信息。针对这些信息,可以使用Python的第三方库BeautifulSoup将HTML代码进行解析,并提取我们需要的数据。 3. 编写Python爬虫代码 在分析完网页结构和获取数据方法后,就可以着手编写Python爬虫代码了。首先需要导入所需的第三方库,包括requests、BeautifulSoup和pymongo等,然后通过requests库获取网页HTML源代码: import requests # 热搜页面链接 url = 'https://s.weibo.com/top/summary?cate=realtimehot' # 请求头 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'} # 发送请求 response = requests.get(url, headers=headers) html = response.text 然后通过BeautifulSoup库解析HTML源代码,提取出热搜话题的相关信息,并构造字典保存到列表: from bs4 import BeautifulSoup soup = BeautifulSoup(html, 'html.parser') cards = soup.find_all(class_='card') # 爬取到的热搜总数 count = len(cards) # 热搜列表 hot_list = [] # 遍历所有热搜 for card in cards: # 热搜排名 rank = card.find(class_='hot').get_text() # 热搜标题 title = card.find(class_='title').get_text().strip() # 热搜热度 value = card.find(class_='line-gradient').get('style').replace('width:', '').replace('%;', '') # 热搜链接 url = 'https://s.weibo.com' + card.find('a').get('href') # 热搜描述 desc = card.find(class_='card-txt').get_text().strip() # 保存为字典 hot_item = { 'rank': rank, 'title': title, 'value': value, 'url': url, 'desc': desc } hot_list.append(hot_item) 最后,可以使用pymongo库连接MongoDB数据库,将爬取到的热搜数据保存到指定的数据集合: import pymongo # MongoDB数据库信息 client = pymongo.MongoClient("mongodb://localhost:27017/") db = client["mydb"] col = db["hot_search"] # 向MongoDB数据库插入数据 for hot in hot_list: col.insert_one(hot) 完整的Python代码如下: import requests from bs4 import BeautifulSoup import pymongo # 热搜页面链接 url = 'https://s.weibo.com/top/summary?cate=realtimehot' # 请求头 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'} # 发送请求 response = requests.get(url, headers=headers) html = response.text soup = BeautifulSoup(html, 'html.parser') cards = soup.find_all(class_='card') # 爬取到的热搜总数 count = len(cards) # 热搜列表 hot_list = [] # 遍历所有热搜 for card in cards: # 热搜排名 rank = card.find(class_='hot').get_text() # 热搜标题 title = card.find(class_='title').get_text().strip() # 热搜热度 value = card.find(class_='line-gradient').get('style').replace('width:', '').replace('%;', '') # 热搜链接 url = 'https://s.weibo.com' + card.find('a').get('href') # 热搜描述 desc = card.find(class_='card-txt').get_text().strip() # 保存为字典 hot_item = { 'rank': rank, 'title': title, 'value': value, 'url': url, 'desc': desc } hot_list.append(hot_item) # MongoDB数据库信息 client = pymongo.MongoClient("mongodb://localhost:27017/") db = client["mydb"] col = db["hot_search"] # 向MongoDB数据库插入数据 for hot in hot_list: col.insert_one(hot) 以上就是爬取微博热搜并保存MongoDB的详细过程。值得注意的是,虽然本例使用的是BeautifulSoup库进行HTML解析,但在实际情况,可以根据自己的需要使用其他第三方库,如pyquery等,实现相同的功能。同时,为遵守法律法规和伦理道德,爬虫应避免对网站造成过度负担,如频繁请求、大量下载等,否则有可能触发反爬虫机制,甚至可能引发安全问题和法律责任。 ### 回答3: 微博热搜是指在微博平台上,各种话题或事件在一段时间内获得了大量关注度,被频繁搜索和转发的现象。由于微博热搜榜单的话题和事件极其多样,反应了公众关注的热点和话题,因此对于许多用户和相关企业而言,获取微博热搜信息是非常必要的。 如何爬取微博热搜并存储到mongodb数据库呢?我们可以使用Python编程语言的一些第三方库来实现这个目标,比如requests、BeautifulSoup、pymongo等。具体步骤如下: 1. 首先,我们需要分析微博热搜榜单的网页结构。使用浏览器打开微博热搜榜单页面,右键点击鼠标,选择“检查”或“审查元素”功能,即可打开浏览器的调试窗口。在调试窗口,我们可以看到热搜榜单的HTML代码及其CSS样式,我们可以据此编写代码来获取信息。 2. 接着,我们需要使用Python的requests库向微博热搜榜单页面发送GET请求,获取页面的HTML代码。代码示例如下: ``` import requests url = 'https://s.weibo.com/top/summary?cate=realtimehot' headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'} response = requests.get(url, headers=headers) html = response.text ``` 3. 接着,我们需要用BeautifulSoup库解析HTML代码,从提取出微博热搜榜单的信息。可以按照如下方式提取信息: ``` from bs4 import BeautifulSoup soup = BeautifulSoup(html, 'html.parser') table = soup.find_all('table')[0] trs = table.tbody.find_all('tr') for tr in trs: #提取信息并保存mongodb数据库 ``` 4. 最后,我们需要使用pymongo库将提取出的微博热搜信息保存mongodb数据。可以按照如下方式实现: ``` import pymongo client = pymongo.MongoClient('localhost', 27017) db = client['weibo'] collection = db['hot_topic'] for tr in trs: tds = tr.find_all('td') rank = tds[0].text.strip() title = tds[1].text.strip() hot_degree = tds[2].text.strip() creation_time = tds[3].text.strip() search_url = tds[1].a.get('href') data = { 'rank': rank, 'title': title, 'hot_degree': hot_degree, 'creation_time': creation_time, 'search_url': search_url } collection.insert(data) ``` 通过以上步骤,我们就可以爬取微博热搜并保存mongodb数据了。这样一来,我们就可以随时随地获取微博热搜的最新情况。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值