【爬虫】百度FengXiangBiao(完全爬虫卡住了,是爬虫+文本提取方式)

news2024/9/23 7:23:16

学习使用。爬虫有风险。使用需谨慎。切记切记。
参考链接:学习python爬虫—爬虫实践:爬取B站排行榜
都是排行榜反正


网页细节

按F12,打开控制台。前端就是这点好,非常直观。
找到排行的具体位置,如下图,这里是【top_rank_list-poi-card】
(所以百度方向标这里实际上是poi数据,刚刚在手机上操作了下,确实,点击某个具体的mall在地图显示的是一个点,不是aoi)
在这里插入图片描述

进一步细节找我需要的数据。一层一层拨开它的心。实际上我只需要名字。也就是绿色框框里的东西。
(问就是懒,一个rank少一二十个,多四五十个,不想一个个自己打)
在这里插入图片描述

综合分析可知,每一个mall都是在class为【top_rank_list-poi-card】的div标签中,
而需要的mall名字则是在【top_rank_list-poi-card-top】的div标签下,【top_rank_list-poi-card-top-right】的【top_rank_list-poi-card-top-right-name】的div标签


request爬取【暂停版】

百度方向标的链接:手机打开百度地图,输入百度风向标,然后分享链接,在电脑端打开就行(直接搜索搜不出来的)
https://ugc.map.baidu.com/cube/feed/bangdancollect?stbar_height=48&city_id=131&loc=&tab1=%E8%B4%AD%E7%89%A9&tab2=%E8%B4%AD%E7%89%A9%E4%B8%AD%E5%BF%83&district_index=%E5%85%A8%E5%9F%8E&shangquan_index=&ncpshare=yymap

从链接其实可以看出,诸如city_id=131,这个131是北京,后面具体每个分类tab有不同。
没用过百度地图API,应该是一样的对应方式
在这里插入图片描述

import json
import requests
from bs4 import BeautifulSoup

#返回服务器响应
def download_html(url, headers):
    # 发送请求,获取并返回响应
    res = requests.get(url, headers=headers)
    res.encoding = 'utf-8-sig'
    res = res.text.encode('utf-8-sig').decode('unicode_escape') #返回的res从ASCII转为unicode格式
    return res
    
#main function
def main():
    url = 'https://ugc.map.baidu.com/cube/feed/bangdancollect?'\
        'stbar_height=48&city_id=131&loc=&tab1=%E8%B4%AD%E7%89%A9&'\
        'tab2=%E8%B4%AD%E7%89%A9%E4%B8%AD%E5%BF%83'\
        '&district_index=%E5%85%A8%E5%9F%8E&shangquan_index=&ncpshare=yymap'

    headers = {
         'User-Agent': 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-us)'
                       'AppleWebKit/534.50 (KHTML, like Gecko)'
                       'Version/5.1 Safari/534.50'}   
    
    html = download_html(url, headers)
    print(html)
    print('***********************************************************')

if __name__ == '__main__':
    main()

注意了,直接用跑上面代码,html获得的信息,需要仔细找我们需要的信息
在这里插入图片描述
在这里插入图片描述
从上面的图可以知道,我们需要的信息实际上,是在“select_field”里面。
所以下面做的是完善代码,提取我们需要的信息。


好的那么问题又来了。
现在根据参考链接,定义一个新的函数parse_html用来解析html,在rank_list,我们是不会得到返回值的!!!

import json
import requests
from bs4 import BeautifulSoup

#返回服务器响应
def download_html(url, headers):
    # 发送请求,获取并返回响应
    res = requests.get(url, headers=headers)
    res.encoding = 'utf-8-sig'
    res = res.text.encode('utf-8-sig').decode('unicode_escape') #返回的res从ASCII转为unicode格式
    return res
    
#解析html,返回排行榜信息
def parse_html(html):
    soup=BeautifulSoup(html,'html.parser')
    rank_list = soup.find_all('.detail_info')  # 获取排行榜列表
    print(rank_list)
    
#main function
def main():
    url = 'https://ugc.map.baidu.com/cube/feed/bangdancollect?'\
        'stbar_height=48&city_id=131&loc=&tab1=%E8%B4%AD%E7%89%A9&'\
        'tab2=%E8%B4%AD%E7%89%A9%E4%B8%AD%E5%BF%83'\
        '&district_index=%E5%85%A8%E5%9F%8E&shangquan_index=&ncpshare=yymap'

    headers = {
         'User-Agent': 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-us)'
                       'AppleWebKit/534.50 (KHTML, like Gecko)'
                       'Version/5.1 Safari/534.50'}   
    
    html = download_html(url, headers)
    data_list = parse_html(html)
    print(html)
    print('***********************************************************')

if __name__ == '__main__':
    main()

为什么呢,因为

在这里插入图片描述
这里有个beautifulsoup的基础文档还可以:

CSDN博主MilkLeong:Beautiful Soup库入门(标签树、基本元素、遍历、输出)
https://blog.csdn.net/MilkLeong/article/details/106156193


转文档提取版

由前面的卡壳处可知,需要转JavaScript。这个我还没研究。山重水复疑无路,咱换种思路。
首先,把前面的内容转为文本。就是整个【window._smarty_page_data = {“filter_info”:{"cXXXXXX】。然后跑下面的代码

import re
import pandas as pd
import json

def extract_key_value_pairs(data):
    data = data.strip('{}')
    pairs = data.split(',')
    
    result = {}
    for pair in pairs:
        pattern = r'"([^"]+)":"([^"]+)"' #"key":"value"
        match = re.search(pattern, pair)
        if match:
            key = match.group(1)
            value = match.group(2)
#             print(key, value)
        else:
            continue
            print("Invalid key-value pair")
        result[key] = value
    return result

filepath=r"XXXXX.txt"
with open(filepath, "r") as file:
    contents=file.read()
    
    #regular expression
    pattern=re.compile('rank_list.+本市商业街榜')
    specific_content=pattern.findall(contents)
    
    #delete certain contents
    specific_content=str(specific_content)
    cleaned_text = specific_content.replace("['rank_list\":[", '')
    cleaned_text = cleaned_text.replace('],"title":"本市商业街榜\']', '')

#split individual mall infomation
single_mall = cleaned_text.split('},{')

#change the infomation to dataframe format
result_list = []
for mall in single_mall:
    key_value_pairs = extract_key_value_pairs(mall)
    result_list.append(key_value_pairs)
    print(result_list)

# 将结果列表转换为 JSON 格式
df=pd.DataFrame(result_list)
df
#     result_list.append(key_value_pairs)

最后获得我们想要的df格式
在这里插入图片描述

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

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

相关文章

不知道ai自动生成绘画网站有哪些就试试这些ai绘画软件

自然语言处理技术和机器学习的不断发展,为艺术创作和设计领域带来了新的可能性。随着人工智能技术的进步,越来越多的网站和平台开始利用ai技术,为大家提供自动生成绘画的功能。这些ai绘画网站通过深度学习和生成对抗网络等先进技术&#xff0…

排列组合算法

排列组合算法 next_permutation(下一个序列)prev_permutation(上一个序列) 主要是两个函数 第一个:next_permutation 下一个序列 第二个:prev_permutation 上一个序列 next_permutation(下一个序列) 如果说…

React项目通过webpack-plugin-istanbul生成覆盖率报告

早期开发前端覆盖率的时候,使用的是Vue项目,对应的插件是babel-plugin-istanbul,后来发现公司产品使用的是React项目,babel-plugin-istanbul插件就不太支持了。在网上搜索了一下,发现一个全新的插件:webpac…

【Android】组件安全之Activity

前言 前文系统的总结了组件会有什么安全问题,本文详细的从不同的组件切入,深入的解析组件的实现方式。组件安全https://blog.csdn.net/xiru9972/article/details/123537641?ops_request_misc&request_id7a89a72fdd464cee90c20b2b88549c11&biz_…

这么菜还敢要20K?我还不如直接招个应届生

公司今年要招人,面倒是面了很多测试,但没有一个合适的。一开始想要的就是中级的水准,也没指望来大牛,当然来了更好,提供的薪资在10-20k,来面试的人有很多,但平均水准真的是让人失望。 看简历时很多都写着3…

两数相加(java)

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。 请你将两个数相加,并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外,这两个数都不会以 0 …

[github-100天机器学习]day1 data preprocessing

https://github.com/LiuChuang0059/100days-ML-code/blob/master/Day1_Data_preprocessing/README.md#step-6-feature-scaling—特征缩放 数据预处理 数据帧(Data Frame) 二维的表格形式,类似于电子表格或关系型数据库中的表。数据帧通常被用来存储和操作结构化数据…

移动信号灯通信协议-CWAVE-MTFBWY-TSLI 移动式智能路侧系统

1 产品概览 CWAVE-MTFBWY-TSLⅠ型移动式智能路侧系统 ,可通过 LTE-V实现与 实现与 车 载设备 及其他路侧设备 进行信息 交互 。该移动式智能路侧系统可根据实际需求 选配 智能交通信号灯 与/或感知检测设备 ,其中 可选配 的感知 检测 设备包括 微波 雷达…

随机森林算法介绍及多分类预测的R实现

随机森林(Random Forest)是一种经典的机器学习算法,是数据科学家中最受欢迎和常用的算法之一,最早由Leo Breiman和Adele Cutler于2001年提出。它是基于集成学习(Ensemble Learning)的一种方法,通…

数据库选型sql和nosql

一、数据库选型sql和nosql: 1.1关系型数据库sql和非关系型数据库nosql 1.2关系型数据库特点: 数据结构化存储在二维表中 支持事务的原子性A,一致性C,隔离性I持久性D 特性 支持使用SQL语言对存储在其中的数据进行操作 1.3关系型数据库的适用场景&…

pwn(7.3)

Nc 通过nc,我们可以链接到对方的服务器 再用过Linux的命令可以查找到我们想要的信息 Ret2txt 先查壳 没开任何保护,拿IDA看看 很明显的栈溢出,看到/bin/sh地址 解释,通过汇编语言我们知道调用函数使用call命名,c…

HNU-小学期工训-STC-B案例测试作业

对于一些案例,这里列举一些 流水灯 八位数码管动态扫描 八位数码管流水灯(有BSP版本) 八位数码管滚动显示(有BSP版本) 可变亮度的数码管显示(有BSP版本) 扫描频率可改变的电子钟 按键消抖计数(有BSP版本) 三按键测试(有BSP版本) 霍尔磁场检测(有BSP版本) 数…

精通ES+ES大数据查询常见的疑难杂症的解决与实现

目录 什么是BoolQueryBuilder? 简单的复合查询 RestHighLevelClient中的matchQuery与matchPhraseQuery与termQuery的在实际使用中的不同 ES是否能在类型为text的字段的内部使用keyword,如果能这样做的含义是什么? 什么是ES多字段&#xf…

BES 的BLE MTU设置

1 BES BLE MTU 一个默认的MTU大小,通常为23字节,通过协商,可以使用更大的MTU,最高可达512字节, 2 协商方法

leetcode146.手撸 LRU 算法(java)

LRU 缓存 LRU 缓存题目描述LRU 介绍LRU 算法设计代码实现 单调栈算法 LRU 缓存 来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/lru-cache 题目描述 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实…

HNU-小学期工训-STC-B测试记录表

说明1“分类I”为检测电路板硬件测试案例,“分类ⅡI、Ⅲ、IV”为不同层次综合应用案例。"分类1、Ⅱ、Ⅲ”必做,“分类TV”选做。 说明2:“测试/故障现象记录”栏:记录实际测量效果并与案例说明对比,并记录;有故障时,记录所见…

《AutoSar实战》读写DID之一:CDD准备

文章目录 前言一、1.新建DID1,使用 **CANdelaStudio** 软件打开工程中的CDD文件并创建DID1) 创建DID2) 详细配置DID3)配置读写服务权限 二、同步更新工具链配置1 更新文件并检查1) 更新CDD文件2)检查更新结果 总结 前言 本章节主…

大型语言模型与知识图谱协同研究综述:两大技术优势互补

机器之心报道 编辑:杜伟 多图综述理清当前研究现状,这篇 29 页的论文值得一读。 大型语言模型(LLM)已经很强了,但还可以更强。通过结合知识图谱,LLM 有望解决缺乏事实知识、幻觉和可解释性等诸多问题&am…

记录一下kibana启动连接报错问题(kibana server is not ready yet)

记录一下kibana启动连接报错问题(kibana server is not ready yet) 今天启动kibana出现该问题 先去看了看是否是elasticsearch连接出错 启动了容器 docker start elasticsearch docker start kibana进入了kibana容器 docker exec -it kibana bash进行了下面的操作&#xf…

注册微信小程序平台安装微信小程序开发工具(详细教程)

首先我们先去微信小程序平台注册账号,下面是网址 首页 | 微信开放社区 进入后,使用手机扫描登录,然后,选择小程序,选择个体——填写个人信息——进入到开发者平台(相信这里对一个开发者很简单了吧&#xff…