python网络爬虫(四)——实战练习

0.为什么要学习网络爬虫

  深度学习一般过程:
在这里插入图片描述
  收集数据,尤其是有标签、高质量的数据是一件昂贵的工作。
  爬虫的过程,就是模仿浏览器的行为,往目标站点发送请求,接收服务器的响应数据,提取需要的信息,并进行保存的过程。
  Python为爬虫的实现提供了工具:requests模块、BeautifulSoup库

1.爬虫练习前言

  本次实践使用Python来爬取百度百科中《青春有你2》所有参赛选手的信息。
  数据获取:https://baike.baidu.com/item/青春有你第二季
在这里插入图片描述

普通用户:
  打开浏览器 --> 往目标站点发送请求 --> 接收响应数据 --> 渲染到页面上。

爬虫程序:
   模拟浏览器 --> 往目标站点发送请求 --> 接收响应数据 --> 提取有用的数据 --> 保存到本地/数据库。

  本实践中将会使用以下两个模块,首先对这两个模块简单了解以下:

request模块:

  requests是python实现的简单易用的HTTP库,官网地址:http://cn.python-requests.org/zh_CN/latest/
  requests.get(url)可以发送一个http get请求,返回服务器响应内容。

BeautifulSoup库:

  BeautifulSoup是一个可以从HTML或XML文件中提取数据的Python库。
  网址:https://beautifulsoup.readthedocs.io/zh_CN/v4.4.0/
  BeautifulSoup支持Python标准库中的HTML解析器,还支持一些第三方的解析器,其中一个是 lxml。
  BeautifulSoup(markup, “html.parser”)或者BeautifulSoup(markup,
“lxml”),推荐使用lxml作为解析器,因为效率更高。

2.程序代码

import json
import re
import requests
import datetime
from bs4 import BeautifulSoup
from urllib import parse
import ostoday = datetime.date.today().strftime('%Y%m%d')def crawl_wiki_data():"""爬取百度百科中《青春有你2》中参赛选手信息,返回html"""headers = {#'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'#'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.41 Safari/537.36 Edg/101.0.1210.32''User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36 Edg/128.0.0.0'}url='https://baike.baidu.com/item/青春有你第二季'try:response = requests.get(url, headers=headers)print(response.status_code)# 将一段文档传入BeautifulSoup的构造方法,就能得到一个文档的对象, 可以传入一段字符串soup = BeautifulSoup(response.text, 'lxml')# 返回的是class为table-view log-set-param的<table>所有标签tables = soup.find_all('table', {'class': 'table-view log-set-param'})crawl_table_title = "参赛学员"for table in tables:# 对当前节点前面的标签和字符串进行查找table_titles = table.find_previous('div').find_all('h3')for title in table_titles:if (crawl_table_title in title):return tableexcept Exception as e:print(e)def parse_wiki_data(table_html):'''从百度百科返回的html中解析得到选手信息,以当前日期作为文件名,存JSON文件,保存到work目录下'''bs = BeautifulSoup(str(table_html), 'lxml')all_trs = bs.find_all('tr')error_list = ['\'', '\"']stars = []for tr in all_trs[1:]:all_tds = tr.find_all('td')star = {}# 姓名star["name"] = all_tds[0].text# 个人百度百科链接star["link"] = 'https://baike.baidu.com' + all_tds[0].find('a').get('href')# 籍贯star["zone"] = all_tds[1].text# 星座star["constellation"] = all_tds[2].text# 身高star["height"] = all_tds[3].text# 体重star["weight"] = all_tds[4].text# 花语,去除掉花语中的单引号或双引号flower_word = all_tds[5].textfor c in flower_word:if c in error_list:flower_word = flower_word.replace(c, '')# 公司if not all_tds[6].find('a') is None:star["company"] = all_tds[6].find('a').textelse:star["company"] = all_tds[6].textstar["flower_word"] = flower_wordstars.append(star)json_data = json.loads(str(stars).replace("\'", "\""))with open('data/' + today + '.json', 'w', encoding='UTF-8') as f:json.dump(json_data, f, ensure_ascii=False)def crawl_pic_urls():'''爬取每个选手的百度百科图片,并保存'''with open('data/' + today + '.json', 'r', encoding='UTF-8') as file:json_array = json.loads(file.read())statistics_datas = []headers = {# 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36''User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.41 Safari/537.36 Edg/101.0.1210.32'}for star in json_array:name = star['name']link = star['link']# 向选手个人百度百科发送一个http get请求response = requests.get(link, headers=headers)# 将一段文档传入BeautifulSoup的构造方法,就能得到一个文档的对象bs = BeautifulSoup(response.text, 'lxml')# 从个人百度百科页面中解析得到一个链接,该链接指向选手图片列表页面pic_list_url = bs.select('.summary-pic a')[0].get('href')pic_list_url = 'https://baike.baidu.com' + pic_list_url# 向选手图片列表页面发送http get请求pic_list_response = requests.get(pic_list_url, headers=headers)# 对选手图片列表页面进行解析,获取所有图片链接bs = BeautifulSoup(pic_list_response.text, 'lxml')pic_list_html = bs.select('.pic-list img ')pic_urls = []for pic_html in pic_list_html:pic_url = pic_html.get('src')pic_urls.append(pic_url)# 根据图片链接列表pic_urls, 下载所有图片,保存在以name命名的文件夹中down_pic(name, pic_urls)def down_pic(name,pic_urls):'''根据图片链接列表pic_urls, 下载所有图片,保存在以name命名的文件夹中,'''path = 'work/'+'pics/'+name+'/'if not os.path.exists(path):os.makedirs(path)for i, pic_url in enumerate(pic_urls):try:pic = requests.get(pic_url, timeout=15)string = str(i + 1) + '.jpg'with open(path+string, 'wb') as f:f.write(pic.content)print('成功下载第%s张图片: %s' % (str(i + 1), str(pic_url)))except Exception as e:print('下载第%s张图片时失败: %s' % (str(i + 1), str(pic_url)))print(e)continuedef show_pic_path(path):'''遍历所爬取的每张图片,并打印所有图片的绝对路径'''pic_num = 0for (dirpath, dirnames, filenames) in os.walk(path):for filename in filenames:pic_num += 1print("第%d张照片:%s" % (pic_num, os.path.join(dirpath, filename)))print("共爬取《青春有你2》选手的%d照片" % pic_num)if __name__ == '__main__':#爬取百度百科中《青春有你2》中参赛选手信息,返回htmlhtml = crawl_wiki_data()#解析html,得到选手信息,保存为json文件parse_wiki_data(html)#从每个选手的百度百科页面上爬取图片,并保存crawl_pic_urls()#打印所爬取的选手图片路径#('/home/aistudio/work/pics/')print("所有信息爬取完成!")

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

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

相关文章

【408DS算法题】034进阶-22年真题_判断顺序存储二叉树是否是BST

Index 真题题目分析实现总结 真题题目 已知非空二叉树T的结点值均为正整数&#xff0c;采用顺序存储方式保存&#xff0c;数据结构定义如下: typedef struct { // MAX_STZE为已定义常量int SqBiTNode[MAX_SIZE]; // 保存二叉树结点值的数组int ElemNum; …

java 常用并发队列- DelayQueue

1. 什么是 DelayQueue&#xff1f; DelayQueue 是一个支持 延迟获取元素 的阻塞队列&#xff0c;它的元素必须实现 java.util.concurrent.Delayed 接口&#xff0c;该接口要求元素定义一个 getDelay(TimeUnit unit) 方法&#xff0c;用来指定元素何时可以从队列中取出。DelayQ…

Python简易IDE工作界面制作

、 休闲一下&#xff0c;学习编程还是要学习一些界面编程&#xff0c;能够根据需要制作图形操作界面&#xff0c;这样我们开发的程序才能方便操作和使用&#xff0c;同时获得更友好的人机交互体验。下面是一个用PyQt5制作的简易界面&#xff0c;供大学参考。如下图所示&a…

【淘宝采集项目经验分享】商品评论采集 |商品详情采集 |关键词搜索商品信息采集

商品评论采集 1、输入商品ID 2、筛选要抓取评论类型 3、填写要抓取的页数 4、立刻提交-启动测试 5、等爬虫结束后就可以到“爬取结果”里面下载数据 商品详情采集 1、输入商品ID 2、立刻提交-启动爬虫 3、等爬虫结束后就可以到“爬取结果”里面下载数据 taobao.item_…

【Python】Python 读取Excel、DataFrame对比并选出差异数据,重新写入Excel

背景&#xff1a;我在2个系统下载出了两个Excel&#xff0c;现在通过对下载的2个Excel数据&#xff0c;并选出差异数据 从新写入一个新的Excel中 differences_url rC:\Users\LENOVO\Downloads\differences.xlsx; //要生成的差异Excel的位置及名称 df1_url rC:\Users\LENOVO\Dow…

【 WPF 中常用的Brush类的简要介绍、使用方法和适用场景】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 WPF 中常用的 Brush 类的简要介绍、使用方法和适用场景 使用场景解释示例代码&#xff08;为按钮创建一个线性渐变背景&#xff09; Brush 类描述使用示例适用场景SolidColor…

cocotb备忘录

按位给和int int后接的值&#xff0c;建议在32之内。大于32位建议按位给&#xff0c;因为int强制类型转换有范围 第二&#xff0c;低位给到低位&#xff0c;高位给到高位 # 将src_ip和dst_ip给到phv中,TMD以后只要报错在这个范围里面&#xff0c;TMD直接马上用手算一遍能不能…

0903,LIST(merge,splice,sort,unique),SET(insert,erase)

目录 03_vector_delete.cc 04_vector_shrink.cc 05_vec_emplace_back.cc 06_listspec_splice.cc 07_classstruct.cc 08_set.cc 09_setErase.cc 作业 01 STL中的容器包括哪些&#xff1f;各自具有哪些特点&#xff1f; 02 题目&#xff1a;编写代码&#xff1a;将…

Docker设置socks5代理

查看测试环境 $ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 22.04.4 LTS Release: 22.04 Codename: jammy修改 Docker 服务代理配置文件 $ sudo mkdir -p /etc/systemd/system/docker.service.d $ sudo vi /etc/systemd/syst…

使用Spring Boot拦截器实现时间戳校验以防止接口被恶意刷

使用Spring Boot拦截器实现时间戳校验以防止接口被恶意刷 在开发Web应用程序时&#xff0c;接口被恶意刷请求&#xff08;例如DDoS攻击或暴力破解&#xff09;是一个常见的安全问题。为了提高接口的安全性&#xff0c;我们可以在服务端实现时间戳校验&#xff0c;以确保请求的…

基于Spring的消息推送实战(Websocket和前端轮询实现)

基于Spring的消息推送实战&#xff08;Websocket和前端轮询实现&#xff09; 本文介绍了基于Spring的消息推送实现方法&#xff0c;主要介绍了websocket实时消息推送方法&#xff08;ServerEndpoint方式实现&#xff09;&#xff0c;以及前端客户端轮询方式的消息推送。 一、消…

【Qt】 QComboBox | QSpinBox

文章目录 QComboBox —— 下拉框QComboBox 属性核心方法核心信号QComboBox 使用 QSpinBox —— 微调框QSpinBox 属性核心信号QSpinBox 使用 QComboBox —— 下拉框 QComboBox 属性 QComboBox —— 表示下拉框 currentText ——当前选中的文本 currentindex ——当前选中的条…

如何在虚拟机中安装部署K8S?

教程参考&#xff1a;centos7安装k8s 1.28版本&#xff0c;基于科学-CSDN博客 环境准备&#xff1a; 准备三台机器&#xff0c;都做以下操作&#xff0c;或者只准备一个机器&#xff0c;最后再克隆两台。 yum&#xff1a; 换源&#xff0c;这是阿里云的源 sudo wget -O /etc…

详解Asp.Net Core管道模型中的五种过滤器的适用场景与用法

1. 前言 在 ASP.NET Core 中&#xff0c;过滤器是一种用于对请求管道进行前置或后置处理的组件。它们可以在请求处理的不同阶段干预和修改请求和响应&#xff0c;以实现一些通用的处理逻辑或功能增强。 ASP.NET Core 的管道模型由多个中间件组成&#xff0c;而过滤器是这个模…

kafka及异步通知文章上下架

1)自媒体文章上下架 需求分析 2)kafka概述 消息中间件对比 特 性 ActiveMQ RabbitMQ RocketMQ Kafka 开 发 语 言 java erlang java scala 单 机 吞 吐 量 万级 万级 10万级 100万级 时 效 性 ms us ms ms级以内 可 用 性 高&#xff08;主从&#xff0…

如何从 Bak 文件中恢复 SQL数据库?(3种方法)

如何从 .bak 文件恢复 SQL数据库&#xff1f; 在数据库管理和维护过程中&#xff0c;数据的安全性和完整性至关重要。备份文件&#xff08;.bak 文件&#xff09;是 SQL Server 中常用的数据库备份格式&#xff0c;它包含了数据库的完整副本&#xff0c;用于在数据丢失、系统故…

flutter与原生怎么交互的

Flutter 与原生平台(如 Android 和 iOS)之间的交互可以通过**平台通道(Platform Channels)**实现。这允许你在 Flutter 应用中调用原生代码,或者从原生代码中调用 Flutter 代码。这种机制使得你可以利用原生平台提供的特性和 API,同时保持大部分应用代码在 Flutter 中。 …

4. 第一个3D案例—创建3D场景

入门Three.js的第一步&#xff0c;就是认识场景Scene、相机Camera、渲染器Renderer三个基本概念&#xff0c;接下来&#xff0c;咱们通过三小节课&#xff0c;大家演示“第一个3D案例”完成实现过程。 学习建议&#xff1a;只要你能把第一个3D案例搞明白&#xff0c;后面学习就…

二百六十、Java——采集Kafka数据,解析成一条条数据,写入另一Kafka中(复杂JSON)

一、目的 由于部分数据类型频率为1s&#xff0c;从而数据规模特别大&#xff0c;因此完整的JSON放在Hive中解析起来&#xff0c;尤其是在单机环境下&#xff0c;效率特别慢&#xff0c;无法满足业务需求。 而Flume的拦截器并不能很好的转换数据&#xff0c;因为只能采用Java方…

SEO之网站结构优化(十四-内部链接及权重分配3)

初创企业搭建网站的朋友看1号文章&#xff1b;想学习云计算&#xff0c;怎么入门看2号文章谢谢支持&#xff1a; 1、我给不会敲代码又想搭建网站的人建议 2、“新手上云”能够为你开启探索云世界的第一步 博客&#xff1a;阿幸SEO~探索搜索排名之道 7、锚文字分布及变化 前面…