Python爬虫-经典案例详解
爬虫一般指从网络资源的抓取,通过Python语言的脚本特性,配置字符的处理非常灵活,Python有丰富的网络抓取模块,因而两者经常联系在一起Python就被叫作爬虫。爬虫可以抓取某个网站或者某个应用的内容提取有用的价值信息。有时还可以模拟用户在浏
览器或app应用上的操作行为,从而实现程序自动化。
1、爬虫架构
爬虫架构通常由5个部分组成,分别是调度器、URL管理器、网页下载器、网页解析器、应用程序。
- 调度器:相当电脑的CPU,主要负责调度URL管理器、下载器、解析器之间的协调工作。
- URL管理器:包括待爬取的URL地址和已爬取的URL地址,防止重复抓取URL和循环抓取URL。实现URL管理器通常有三种方式,通过内存、数据库、缓存方式实现。
- 网页下载器:通过传入一个URL地址来下载网页,将网页转换成一个字符串,网页下载器有urllib2(Python官方基础模块)包括需要登录、代理、和cookie,requests(第三方包)。
- 网页解析器:用于某个网页字符串进行解析,可以按照我们的要求来提取出有用的信息,也可以根据DOM树的解析方式来解析。常用的解析器有html.parser(python自带的)、beautifulsoup(也可以使用python自带的html.parser进行解析,也可以使用lxml进行解析,相对于其他几种来说要强大一些)、lxml(可以解析 xml 和 HTML),通过html.parser 和 beautifulsoup 以及 lxml 都是以DOM 树的方式进行解析。
- 应用程序:用于从网页中提取的有用数据组成的一个应用。
2、爬虫实现
2.1、Url管理器(基于内存)
class UrlManager():"""url 管理器,用来装载网址所有地址"""def __init__(self):# 新url 集合self.new_urls = set()# 旧url 集合self.old_urls = set()def add_new_url(self, url):"""添加新的url到集合:param url: url:return:"""if url is None or len(url) == 0:returnif url in self.new_urls or url in self.old_urls:returnself.new_urls.add(url)def add_new_urls(self, urls):"""批量添加urls:param urls: url:return:"""if urls is None or len(urls) == 0:returnfor url in urls:self.add_new_url(url)def get_url(self):"""获取url: 从new_urls集合获取url,放入到old_urls:return:"""if self.has_new_url():url = self.new_urls.pop()self.old_urls.add(url)return urlelse:return Nonedef has_new_url(self):"""判断是否有新的url:return:"""return len(self.new_urls) > 0if __name__ == '__main__':url_manager = UrlManager()url_manager.add_new_url('url1')url_manager.add_new_urls(['url1','url2'])print(url_manager.new_urls, url_manager.old_urls)print("#" * 30)new_url = url_manager.get_url()print(url_manager.new_urls, url_manager.old_urls)print("#" * 30)new_url = url_manager.get_url()print(url_manager.new_urls, url_manager.old_urls)print("#" * 30)print(url_manager.has_new_url())
2.2 网页解析
import re
from utils import url_manager
import requests
from bs4 import BeautifulSoupdef download_all_urls(root_url):"""爬取根网址所有页面的url:param root_url: 根网址地址:return:"""urls = url_manager.UrlManager()urls.add_new_url(root_url)fout = open("craw_all_pages.txt", "w", encoding="utf-8")while urls.has_new_url():curr_url = urls.get_url()r = requests.get(curr_url, timeout=5)r.encoding = "utf-8"if r.status_code != 200:print("error, return status_code is not 200", curr_url)continuesoup = BeautifulSoup(r.text, "html.parser", from_encoding="utf-8")title = soup.title.stringfout.write("%s\t%s\n" % (curr_url, title))fout.flush()print("success: %s, %s, %d" % (curr_url, title, len(urls.old_urls)))links = soup.find_all("a")for link in links:href = link.get("href")if href is None:continue#模式匹配pattern = r'^https://www.runoob.com/python/\s+.html$'if re.match(pattern, href):urls.add_new_url(href)fout.close()if __name__ == '__main__':#定义根网址urlroot_url = "https://www.runoob.com/python/python-tutorial.html"download_all_urls(root_url)
3、经典案例
例如:读取某网站Top250电影。
import pprint
import json
import requests
from bs4 import BeautifulSoup
import pandas as pd"""
# requests 请求网站地址
# beautifulsoup4 解析网址的elements(div,class,<a>,<img> id)等
# pandas 将数据写入到excel
# 其他额外安装包openpyxl
"""# 构造分页数字列表(步长/pageSize/step=25)
page_indexs = range(0, 250, 25)
list(page_indexs)def download_all_htmls(root_url, headers):"""下载所有页面的html内容,用于后续分析:return:"""htmls = []for idx in page_indexs:url = "%s?start=%d&filter=" % (root_url, idx)# url = f"https://movie.douban.com/top250?start={idx}&filter="print("craw html:", url)r = requests.get(url, timeout=5, headers=headers)if r.status_code != 200:raise Exception("error")htmls.append(r.text)return htmlsdef parse_single_html(html_doc):soup = BeautifulSoup(html_doc, "html.parser")article_items = (soup.find("div", class_="article").find("ol", class_="grid_view").find_all("div", class_="item"))datas = []for item in article_items:rank = item.find("div", class_="pic").find("em").get_text()info = item.find("div", class_="info")title = info.find("div", class_="hd").find("span", class_="title").get_text()stars = (info.find("div", class_="bd").find("div", class_="star").find_all("span"))rating_star = stars[0]["class"][0]rating_num = stars[1].get_text()comments = stars[3].get_text()datas.append({"rank": rank,"title": title,"rating_star": rating_star.replace("rating", "").replace("-t", ""),"rating_num": rating_num,"comments": comments.replace("人评价", "")})return datasdef save_to_excel(all_datas):"""保存解析后数据到excel:param all_datas: 传人数据:return:"""# print tabledf = pd.DataFrame(all_datas)print(df)df.to_excel("豆瓣电影TOP250.xlsx")if __name__ == '__main__':# 模拟用户行为headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36"}# 定义根网址urlroot_url = "https://movie.douban.com/top250"htmls = download_all_htmls(root_url, headers)# beatiful print textpprint.pprint(parse_single_html(htmls[0]))# extend迭代添加到list,保存到excelall_datas = []for html in htmls:all_datas.extend(parse_single_html(html))print(len(all_datas))save_to_excel(all_datas)
相关文章:
Python爬虫-经典案例详解
爬虫一般指从网络资源的抓取,通过Python语言的脚本特性,配置字符的处理非常灵活,Python有丰富的网络抓取模块,因而两者经常联系在一起Python就被叫作爬虫。爬虫可以抓取某个网站或者某个应用的内容提取有用的价值信息。有时还可以…...
【信创】银河麒麟V10 安装postgis
安装postGis步骤 1、安装 proj4 #tar -zxvf proj-4.8.0.tar.gz #cd proj-4.8.0 #mkdir -p /opt/proj-4.8.0 #./configure --prefix=/opt/proj-4.8.0 #make && make install #vi /etc/ld.so.conf.d/proj-4.8.0.conf #ldconfig 2、安装 geos #tar -xjf geos-3.6.1.tar.b…...
OpenCV常用功能——灰度处理和图像二值化处理
文章目录 一、灰度处理1.1 cvtColor函数 二、图像二值化处理2.1 全局阈值2.2 自适应阈值 一、灰度处理 1.1 cvtColor函数 函数原型: cv2.cvtColor(src, code[, dst[, dstCn]]) -> dst功能:转换图像颜色空间。 参数: src: 输入图像。co…...
excel巧用拼接函数CONCAT输出JSON、SQL字符串
一、前言 工作中有时候需要用Excel对数据进行组装,需要输出JSON或者SQL语句,然后通过脚本或Java程序完成一些特定功能,总结了一下用到的函数,方便以后使用。这里使用的是WPS软件。 二、输出JSON 例如:需要将几列数据…...
Redis桌面管理工具:Redis Desktop Manager for Mac
Redis Desktop Manager是一款非常实用的Redis管理工具,它不仅提供了方便易用的图形用户界面,还支持多种Redis数据结构,可以帮助用户轻松地完成Redis数据库的管理工作。 以下是一些推荐Redis Desktop Manager的理由: 多平台支持&a…...
基于SSM的汽车维修管理系统
文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于SSM的汽车维修管理系统,java项目。 …...
volatile 系列之如何解决可见性问题
下面我们来看一下volatile是如何解决可见性问题的呢?如果我们针对stop字段增加volatile关键字: public static volatile boolean stopfalse; 然后,使用hsdis工具获取IT编译器生成的汇编指令来查看volatile写操作带来的影响和变化。 接着,设置J…...
网络安全(黑客技术)—小白自学
目录 一、自学网络安全学习的误区和陷阱 二、学习网络安全的一些前期准备 三、网络安全学习路线 四、学习资料的推荐 想自学网络安全(黑客技术)首先你得了解什么是网络安全!什么是黑客! 网络安全可以基于攻击和防御视角来分类&am…...
MTK AEE_EXP调试方法及user版本打开方案
一、AEE介绍 AEE (Android Exception Engine)是安卓的一个异常捕获和调试信息生成机制。 手机发生错误(异常重启/卡死)时生成db文件(一种被加密过的二进制文件)用来保存和记录异常发生时候的全部内存信息,经过调试和仿真这些信息,能够追踪到异常的缘由。 二、调试方法…...
京东平台数据分析:2023年9月京东扫地机器人行业品牌销售排行榜
鲸参谋监测的京东平台9月份扫地机器人市场销售数据已出炉! 根据鲸参谋平台的数据显示,9月份,京东平台扫地机器人的销量近14万,环比增长约2%,同比降低约4%;销售额为2.9亿,环比降低约4%࿰…...
pytorch 笔记:index_select
1 基本使用方法 index_select 是 PyTorch 中的一个非常有用的函数,允许从给定的维度中选择指定索引的张量值 torch.index_select(input, dim, index, outNone) -> Tensorinput从中选择数据的源张量dim从中选择数据的维度index 一个 1D 张量,包含你想…...
面试算法43:在完全二叉树中添加节点
题目 在完全二叉树中,除最后一层之外其他层的节点都是满的(第n层有2n-1个节点)。最后一层的节点可能不满,该层所有的节点尽可能向左边靠拢。例如,图7.3中的4棵二叉树均为完全二叉树。实现数据结构CBTInserter有如下3种…...
Python算法例3 检测2的幂次
1. 问题描述 检测一个整数n是否为2的幂次。 2. 问题示例 n8,返回True;n6,返回False。 3.代码实现 # 采用UTF-8编码格式 # 参数n是一个整数 # 返回True或者False class Solution:def checkPowerOf2(self,n):ans 1for i in range(31):if …...
线扫相机DALSA--采集卡Base模式设置
采集卡默认加载“1 X Full Camera Link”固件,Base模式首先要将固件更新为“2 X Base Camera Link”。 右键SCI图标,选择“打开文件所在的位置”,找到并打开SciDalsaConfig的Demo,如上图所示: 左键单击“获取相机”&a…...
Gitee 发行版
Gitee 发行版 1、Gitee 发行版管理2、项目仓库中创建发行版本3、项目中导入3.1 gradle配置3.2 dependencies执行正常,包没有下载 1、Gitee 发行版管理 Gitee 发行版(Release)管理 2、项目仓库中创建发行版本 按照Gitee官网操作就行 3、项目…...
python面向对象
用animal举例代码如下: class Animal:name age 0def call(self):print(I am %s, and I\m %d years old. % (self.name, self.age))def isMe(self, name) -> bool:return self.name nameanimal Animal() animal.name coco animal.age 10 animal.call()prin…...
Go基础——数组、切片、集合
目录 1、数组2、切片3、集合4、范围(range) 1、数组 数组是具有相同唯一类型的一组已编号且长度固定的数据项序列,这种类型可以是任意的原始类型例如整型、字符串或者自定义类型。 Go 语言数组声明需要指定元素类型及元素个数,与…...
Error: no matching distribution found for tensorflow-cpu==2.6.*
目录 install_tensorflow()安装过程中遇到的问题 查找解决方案过程中: 解决办法: install_tensorflow()安装过程中遇到的问题 在服务器上安装tensorflow时,遇到了一个报错信息: 在网上找到一个类似的错误(TensorFlow…...
nginx 进程模型
文章目录 nginx运行模式与进程模式进程模式流程图默认初始化运行模式与进程模式(宏展开)cpu_affinity多CPU绑定合理性判定Nginx的daemon创建(os/unix/ngx_daemon.c)运行模式、进程模式启动 多进程模式下master处理流程设置进程信号、初始化信号掩码、屏蔽…...
TypeScript - 枚举类型 -字符型枚举
什么是枚举 枚举就是有固定的元素的一个对象。 对象的元素可以直接列举出来。 什么是字符型枚举 字符型枚举,就是元素的值是字符串。 就这么简单。 定义一个我看看 来,让我们实际看一下字符型的枚举。 // 定义字符型枚举 enum COLOR2{RED red,BLUE blu…...
.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...
高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...
DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...
C++ 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
以光量子为例,详解量子获取方式
光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学(silicon photonics)的光波导(optical waveguide)芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中,光既是波又是粒子。光子本…...
WebRTC从入门到实践 - 零基础教程
WebRTC从入门到实践 - 零基础教程 目录 WebRTC简介 基础概念 工作原理 开发环境搭建 基础实践 三个实战案例 常见问题解答 1. WebRTC简介 1.1 什么是WebRTC? WebRTC(Web Real-Time Communication)是一个支持网页浏览器进行实时语音…...
HybridVLA——让单一LLM同时具备扩散和自回归动作预测能力:训练时既扩散也回归,但推理时则扩散
前言 如上一篇文章《dexcap升级版之DexWild》中的前言部分所说,在叠衣服的过程中,我会带着团队对比各种模型、方法、策略,毕竟针对各个场景始终寻找更优的解决方案,是我个人和我司「七月在线」的职责之一 且个人认为,…...
React父子组件通信:Props怎么用?如何从父组件向子组件传递数据?
系列回顾: 在上一篇《React核心概念:State是什么?》中,我们学习了如何使用useState让一个组件拥有自己的内部数据(State),并通过一个计数器案例,实现了组件的自我更新。这很棒&#…...
