Python的网络爬虫介绍与实战

news2024/10/7 14:24:49

Python的网络爬虫基础介绍与实战

  • 定义
  • 流程
  • 包和函数
  • 静动态网页
  • 爬虫实战
    • 红牛分公司?
    • 二手房数据(静态网页)
    • 豆瓣读书(动态网页)

定义

网络爬虫是按照一定的规则,自动地抓取万维网(www)信息的程序或者脚本。借助于网络爬虫的技术,基本上可以做到所见即所得。比如:新闻、搜索引擎、微博、竞品分析和股票等。

流程

在这里插入图片描述

1)发送请求,向对方服务器发送待抓取网站的链接URL;
2)返回请求,在不发生意外的情况下(意外包括网络问题、客户端问题、服务器问题等),对方服务器将会返回请求的内容(即网页源代码)
3)数据存储,利用正则表达式或解析法对源代码作清洗,并将目标数据存储到本地(txt、csv、Excel等)或数据库(MySQL、SQL Server、MongoDB等)

包和函数

import requests
import re
import bs4
requests.get – 基于URL,发送网络请求
re.findall – 基于正则表达式,搜寻目标数据
bs4.BeautifulSoup – 对HTML源代码做解析,便于目标数据的拆解

静动态网页

动态网页就是,页面信息发生变化,但网址没变。
静态网页就是,页面信息发生变化,网址也跟着变化。

爬虫实战

红牛分公司?

首先查看网页源代码。

在网页右击,选择网页源代码,即可查看网页的源代码。
在这里插入图片描述
再寻找规律,运用正则表达式进行提取。

import requests # 提取网页源代码包
import re

url = r'http://www.redbull.com.cn/about/branch'
response = requests.get(url) # 发送链接请求,将会反应以2开头的状态码,证明访问正常
# print(response)
# print(response.text) # 将会反应其文本信息
# print(re.findall('<h2>.*?</h2>', response.text)) # 发现所有的公司都在此规律内
company = re.findall('<h2>(.*?)</h2>', response.text) # 只选择规律内部的文字
# print(re.findall("<p class='mapIco'>.*?</p>", response.text)) # 发现所有的公司地点都在此规律内
add = re.findall("<p class='mapIco'>(.*?)</p>", response.text) # 只选择规律内部的文字
print(company)
print(add)

输出:
在这里插入图片描述

方法二:
因绝大多数语言都是由html语言写出来的,我们就还能发现一些规律,比如:
在这里插入图片描述
公司名称,在h2标签里;地址在p的class=‘mapIco’,邮编在class='telIco’标签里

那么我们不借助于正则表达式,先将字符转变类型对象

然后找对应找的关键字,首先在爬虫的网页中按电脑的f12,出现网页监控,用小箭头回到原网页选择抓取的内容,他就会自动出现
在这里插入图片描述

import requests # 提取网页源代码包
import re
import bs4

url = r'http://www.redbull.com.cn/about/branch'
response = requests.get(url) # 发送链接请求,将会反应以2开头的状态码,证明访问正常
soup = bs4.BeautifulSoup(response.text) # 转换字符类型
# print(soup)
a = soup.findAll(name = 'p', attrs={'class':'mailIco'})  # 第一个参数传递标记名称,第二个传递字典关键词
# print(a)
# 取出文本信息,并用列表表达式表示出来
mail = [i.text for i in a]
tel = [i.text for i in soup.findAll(name = 'p', attrs={'class':'telIco'})]
print(mail)
print(tel)

输出:
在这里插入图片描述
那我们来整理一下,然后将其变成表:

import requests # 提取网页源代码包
import re
import bs4

url = r'http://www.redbull.com.cn/about/branch'
response = requests.get(url) # 发送链接请求,将会反应以2开头的状态码,证明访问正常
soup = bs4.BeautifulSoup(response.text) # 转换字符类型
company = re.findall('<h2>(.*?)</h2>', response.text) # 只选择规律内部的文字
add = re.findall("<p class='mapIco'>(.*?)</p>", response.text) # 只选择规律内部的文字
a = soup.findAll(name = 'p', attrs={'class':'mailIco'})  # 第一个参数传递标记名称,第二个传递字典关键词
mail = [i.text for i in a]
tel = [i.text for i in soup.findAll(name = 'p', attrs={'class':'telIco'})]
import pandas as pd # 后面会讲的函数,利用里面的函数可将其整理变成表
out = pd.DataFrame({'company': company,'add': add, 'mail': mail, 'tel': tel})
print(out)

输出:

在这里插入图片描述

二手房数据(静态网页)

注意:发送链接请求,将会反应以2开头的状态码,证明访问正常(若不是,我们通过网页监视器来找请求头,然后添加)
请求头如何查找:
在这里插入图片描述
对于爬取的对象,用红牛例子中讲的方法,在网页监视器中指针定位。
在这里插入图片描述

import pandas as pd
import requests # 提取网页源代码包
import re
import bs4
# 1.请求信息
url = r'https://sh.lianjia.com/ershoufang/pudong/pg1/'
# 发送链接请求,将会反应以2开头的状态码,证明访问正常(若不是,我们通过网页监视器来找请求头,然后添加)
Headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.139 Safari/537.36'
           } # 表示为浏览器请求头

response = requests.get(url, headers=Headers)
# print(response) # 查看是否为2

# 2.转换内容
soup = bs4.BeautifulSoup(response.text)

# 3.抓取内容
a = soup.findAll(name='a', attrs={'data-el': 'region'}) # 小区信息
name = [i.text.strip() for i in a] # strip是去除空格的
# print(name)
b = [i.text for i in soup.findAll(name='div', attrs={'class': 'houseInfo'})] # 提取该内容是如何的
# print(b)
c = [i.text.split('|') for i in soup.findAll(name='div', attrs={'class': 'houseInfo'})] # 我们发现他是用|隔开的,我们就用列表的方法弄开
# print(c)
Type = [i.text.split('|')[0].strip() for i in soup.findAll(name='div', attrs={'class': 'houseInfo'})] # 我们发现第一列是房子类型,即可全部提取出来
# print(Type)
size = [float(i.text.split('|')[1].strip()[:-2]) for i in soup.findAll(name='div', attrs={'class': 'houseInfo'})] # 我们提取面积的内容,再将纯数字取出,再转化成浮点类型
# print(size)
direction = [i.text.split('|')[2].strip() for i in soup.findAll(name='div', attrs={'class': 'houseInfo'})]
# print(direction)
zhuangxiu = [i.text.split('|')[3].strip() for i in soup.findAll(name='div', attrs={'class': 'houseInfo'})]
# print(zhuangxiu)
flool = [i.text.split('|')[4].strip() for i in soup.findAll(name='div', attrs={'class': 'houseInfo'})]
# print(flool)
year = [i.text.split('|')[5].strip() for i in soup.findAll(name='div', attrs={'class': 'houseInfo'})]
# print(year)
total = [float(i.text[:-1]) for i in soup.findAll(name='div', attrs={'class': 'totalPrice totalPrice2'})]
# print(total)
price = [i.text for i in soup.findAll(name='div', attrs={'class': 'unitPrice'})]
# print(price) 查看之后做切片取值
price = [i.text[:-3] for i in soup.findAll(name='div', attrs={'class': 'unitPrice'})]
# print(price)

out = pd.DataFrame({'name':name,'Type':Type,'size':size,'direction':direction,'zhuangxiu':zhuangxiu,'flool':flool,'year':year,'total':total,'price':price})
print(out)

输出:
在这里插入图片描述

豆瓣读书(动态网页)

异步存储在动态网站
在当前页无法找到存储,但可以找到异步页
js文件或者是xhr
在开发者工具刷新下界面,选中Network
在这里插入图片描述

在这里插入图片描述
我们根据规律发现如下代码:

import re
import requests

url = r'https://movie.douban.com/j/new_search_subjects?sort=U&range=0,10&tags=%E7%94%B5%E5%BD%B1,%E6%96%87%E8%89%BA&start=0&genres=%E5%96%9C%E5%89%A7&countries=%E7%BE%8E%E5%9B%BD&year_range=2010,2019'
Headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.139 Safari/537.36'
           } # 表示为浏览器请求头

response = requests.get(url, headers=Headers)
# print(response) # 查看是否为2
print(response.text)
id = re.findall('"id":"(.*?)"', response.text)
directors = re.findall('"directors":\["(.*?)"\]',response.text)
title = re.findall('"title":"(.*?)"', response.text)
print(id)
print(directors)
print(title)

输出:
在这里插入图片描述

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

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

相关文章

【Kubernetes】k8s删除master节点后重新加入集群

目录 前言一、思路二、实战1.安装etcdctl指令2.重置旧节点的k8s3.旧节点的的 etcd 从 etcd 集群删除4.在 master03 上&#xff0c;创建存放证书目录5.把其他控制节点的证书拷贝到 master01 上6.把 master03 加入到集群7.验证 master03 是否加入到 k8s 集群&#xff0c;检查业务…

用尾插的思想实现移除链表中的元素

目录 一、介绍尾插 1.链表为空 2.链表不为空 二、题目介绍 三、思路 四、代码 五、代码解析 1. 2. 3. 4. 5. 6. 六、注意点 1. 2. 一、介绍尾插 整体思路为 1.链表为空 void SLPushBack(SLTNode** pphead, SLTDataType x) {SLTNode* newnode BuyLTNode(x); …

[大模型]ollama本地部署自然语言大模型

文章目录 ollama下载地址githup百度云 模型默认安装位置模型修改默认安装位置可下载模型相关命令 Chatbox客户端下载地址githup百度云 设置ollama模型并运行 大模型已经发布很久&#xff0c;网络上的大模型形形色色&#xff0c;现在已然是群英荟萃&#xff0c;那么&#xff0c;…

2.vscode 配置python开发环境

vscode用着习惯了,也不想再装别的ide 1.安装vscode 这一步默认已完成 2.安装插件 搜索插件安装 3.选择调试器 Ctrl Shift P&#xff08;或F1&#xff09;&#xff0c;在打开的输入框中输入 Python: Select Interpreter 搜索&#xff0c;选择 Python 解析器 选择自己安…

AI基础知识(2)--决策树,神经网络

1.什么是决策树&#xff1f; 决策树是一类常见的机器学习方法&#xff0c;决策树是基于树的结构来进行决策。决策过程中提出的每一个问题都是对于属性的“测试”&#xff0c;决策的最终结论对应了我们希望的判定结果。一个决策树包含一个根节点&#xff0c;若干个内部节点和若…

实时云渲染及云交互技术的关系

一、实时云渲染和云交互技术 实时云渲染是一种新兴的技术&#xff0c;它可以将用户的计算机上的数据通过云服务器进行渲染&#xff0c;从而实现实时渲染的效果&#xff0c;实时渲染可以在加速渲染速度的同时&#xff0c;实现更高质量的渲染效果、减轻用户的计算机负担、全方位…

【go语言开发】性能分析工具pprof使用

本文主要介绍如何在项目中使用pprof工具。首先简要介绍pprof工具的作用&#xff1b;然后介绍pprof的应用场景&#xff0c;主要分为工具型应用和服务型应用。最后数据分析项目&#xff0c;先采集项目信息&#xff0c;再可视化查看 文章目录 前言应用场景工具型应用服务型应用 数…

22 OpenCV 直方图计算

文章目录 直方图概念split 通道分离函数calcHist 计算直方图normalize 归一化函数示例 直方图概念 上述直方图概念是基于图像像素值&#xff0c;其实对图像梯度、每个像素的角度、等一切图像的属性值&#xff0c;我们都可以建立直方图。这个才是直方图的概念真正意义&#xff0…

R语言:microeco:一个用于微生物群落生态学数据挖掘的R包,第六:trans_nullmodel class

近几十年来&#xff0c;系统发育分析和零模型的整合通过增加系统发育维度&#xff0c;更有力地促进了生态位和中性影响对群落聚集的推断。trans_nullmodel类提供了一个封装&#xff0c;包括系统发育信号、beta平均成对系统发育距离(betaMPD)、beta平均最近分类单元距离(betaMNT…

时间序列预测的零样本学习是未来还是炒作:TimeGPT和TiDE的综合比较

最近时间序列预测预测领域的最新进展受到了各个领域&#xff08;包括文本、图像和语音&#xff09;成功开发基础模型的影响&#xff0c;例如文本&#xff08;如ChatGPT&#xff09;、文本到图像&#xff08;如Midjourney&#xff09;和文本到语音&#xff08;如Eleven Labs&…

【GPT-SOVITS-06】特征工程-HuBert原理

说明&#xff1a;该系列文章从本人知乎账号迁入&#xff0c;主要原因是知乎图片附件过于模糊。 知乎专栏地址&#xff1a; 语音生成专栏 系列文章地址&#xff1a; 【GPT-SOVITS-01】源码梳理 【GPT-SOVITS-02】GPT模块解析 【GPT-SOVITS-03】SOVITS 模块-生成模型解析 【G…

从0开始写一个问卷调查APP的第11天

1.今日任务 分析:上次我们实现了从数据库中成功的查找到对应问卷的问题并在前端展示出来&#xff0c;那么今天我们增加难度。在数据库中插入多项选择问题&#xff0c;在接口中查找到并在前端显示出来。 2.实现 2.1数据库中插入测试数据 我们先查看一下表的结构 2.2接口实现…

软件架构设计 C/S与B/S架构的区别

一、什么是C/S架构&#xff1f; C/S是Client/Server的缩写。服务器通常采用高性能的PC、工作站或小型机&#xff0c;并采用大型数据库系统&#xff0c;如Oracle或SQLServer。 C/S架构软件有一个特点&#xff0c;就是如果用户要使用的话&#xff0c;需要下载一个客户端&#x…

nodejs部署

字符集转换&#xff1a; mysql报错&#xff1a;Incorrect string value: \xF0\x9F... for column XXX at row 1_incorrect string value: \\xf0\\x9f\\x94\\xa5\\xe8-CSDN博客 查看nginx是否启动 ps -ef|grep nginx 检查nginx是否配置正确 nginx -t 防火墙开启端口 启动并…

CCDP.01.使用NotePad++辅助部署OpenStack的说明

前言 对于象OpenStack&#xff08;OS&#xff09;这样的复杂分布式系统&#xff08;云计算平台&#xff09;&#xff0c;一次部署通过是需要相当的Linux基础、网络基础、分布式系统基础、云计算基础的。这里类比在开发大型复杂系统常常采用的“防御式编程”方法论&#xff0c;探…

Vue中使用Lodash

Vue中使用Lodash 前言安装Lodash引用方法vue中使用1、cloneDeep 深拷贝2、uniq 数组去重3、uniqWith 数组对象去重 isEqual 深度比对4、intersection 提取数组相同元素5、chunk 数组切分6、compact去除假值7、reject:根据条件删除指定的值8、find:查找结果的第一个值9、filter:…

Machine Learning ---- Multiple linear regression equation

一、Multiple linear regression: In the study of real-world problems, the changes in the dependent variable are often influenced by several important factors. In this case, it is necessary to use two or more influencing factors as independent variables to e…

如何用Selenium通过Xpath,精准定位到“多个相同属性值以及多个相同元素”中的目标属性值

前言 本文是该专栏的第21篇,后面会持续分享python爬虫干货知识,记得关注。 相信很多同学,都有使用selenium来写爬虫项目或者自动化页面操作项目。同样,也相信很多同学在使用selenium来定位目标元素的时候,或多或少遇见到这样的情况,就是用Xpath定位目标元素的时候,页面…

AI系统性学习01- Prompt Engineering

文章目录 面向开发者的Prompt Engineering一、简介二、Prompt设计原则1 环境配置2.两个基本原则2.1 原则1&#xff1a;编写清晰、具体的指令2.1.1 策略一&#xff1a;分割2.1.2 策略2&#xff1a;结构化输出2.1.3 策略3&#xff1a;模型检测2.1.4 策略4&#xff1a;提供示例 2.…

Godot 学习笔记(1):环境配置

文章目录 前言Godot 环境配置相关链接最简单的按钮项目Sence打包最简单的按钮事件 总结 前言 我从小就有个梦想&#xff0c;我想做游戏。虽然我大学的时候选择了计算机&#xff0c;工作也是计算机&#xff0c;但是我一直没有时间去学游戏引擎。原因有二&#xff1a;第一&#…