Python的网络爬虫介绍与实战

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 reurl = 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 bs4url = 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 bs4url = 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 requestsurl = 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.mzph.cn/news/752265.shtml

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

相关文章

rust引用本地crate

我们可以动态引用crate&#xff0c;build时从crate.io下载&#xff0c;但可能因无法下载导致build失败。首次正常引用三方crate&#xff0c;build时自动下载的crate源码&#xff0c;我们将其拷贝到固定目录中&#xff1b; build后可在RustRover中按住Ctrl键&#xff0c;在crat…

图解Kafka架构学习笔记(一)

本文参考尚硅谷大数据技术之Kafka。 消息队列 &#xff08;1&#xff09;点对点模式&#xff08;一对一&#xff0c;消费者主动拉取数据&#xff0c;消息收到后消息清除&#xff09; 点对点模型通常是一个基于拉取或者轮询的消息传送模型&#xff0c;这种模型从队列中请求信息…

基于Spark的气象数据处理与分析

文章目录 一、实验环境二、实验数据介绍三、数据获取1.观察数据获取方式2.数据爬取3.数据存储4.数据读取5.数据结构6.爬虫过程截图 四、数据分析1.计算各个城市过去24小时累积雨量2.计算各个城市当日平均气温3.计算各个城市当日平均湿度4.计算各个城市当日平均风速 五、数据可视…

流媒体学习之路(WebRTC)——FEC逻辑分析(6)

流媒体学习之路(WebRTC)——FEC逻辑分析&#xff08;6&#xff09; —— 我正在的github给大家开发一个用于做实验的项目 —— github.com/qw225967/Bifrost目标&#xff1a;可以让大家熟悉各类Qos能力、带宽估计能力&#xff0c;提供每个环节关键参数调节接口并实现一个json全…

springboot/ssm冷链物流系统Java在线物流管理系统web物流平台

springboot/ssm冷链物流系统Java在线物流管理系统web物流平台 基于springboot(可改ssm)vue项目 开发语言&#xff1a;Java 框架&#xff1a;springboot/可改ssm vue JDK版本&#xff1a;JDK1.8&#xff08;或11&#xff09; 服务器&#xff1a;tomcat 数据库&#xff1a;…

ARM_基础之RAS

Reliability, Availability, and Serviceability (RAS), for A-profile architecture 源自 https://developer.arm.com/documentation/102105/latest/ 1 Introduction to RAS 1.1 Faults,Errors,and failures 三个概念的区分&#xff1a; • A failure is the event of devia…

保研|资讯|夏令营|3.31截止!香港城市大学市场营销学系首届学术暑期夏令营

香港城市大学市场营销学系首届学术暑期夏令营 1 项目简介 我们的博士项目致力为未来营销科学和工商管理学界培养一流学者和行业领袖。博士项目一般为期四到六年&#xff0c;允许本科生直接申请。课程包括实证分析模型&#xff0c;消费者行为研究&#xff0c;博弈微观模型&…

从零开始学习数据结构与算法:Python实现【第139篇—Python实现】

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 从零开始学习数据结构与算法&#xff1a;Python实现 数据结构与算法是计算机科学中至关重要…

Redis7学习记录(1)

Redis入门概述 Redis介绍 Redis&#xff1a;REmote Dictionary Server&#xff08;远程字典服务器&#xff09; 官网&#xff1a;Redis 中文官网&#xff1a;Redis中文网 Redis的功能及应用 redis是基于内存的KV键值对内存数据库。 redis是key-value数据库&#xff08;NO…

[VCTF2024纳新赛]-PWN:ezhp_code解析

查看保护 查看ida 简单来说就是创建堆块和删除堆块而已&#xff0c;创建堆块的函数附带有写入函数。 但这里要注意一个程序里面的特殊的地方 在我们创建堆块时&#xff0c;程序会先创建一个0xa0大小堆块&#xff0c;并且这个地方还有个特殊的check_handle函数&#xff0c;如果…

测试人员Bug书写规范

&#x1f4cb; 个人简介 作者简介&#xff1a;大家好&#xff0c;我是凝小飞&#xff0c;软件测试领域作者支持我&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; 在测试人员日常工作中&#xff0c;关于bug的编写和定义是一个比较经常的工作&#xff0c;如果bug编写描…

使用Thymeleaf导出PDF,页眉插入图片与内容重叠?

CSS 打印分页功能 需求&#xff1a;打印 在第一页的内容被挤到第二页的时候&#xff0c;又想每一页页头都有相同的样式&#xff0c;使用页眉。 问题&#xff1a;第二页的内容与页眉重叠了&#xff1f; 查各路找出的原因&#xff1a;header 页眉不占空间 解决&#xff1a;不…

深度学习1650ti在win10安装pytorch复盘

深度学习1650ti在win10安装pytorch复盘 前言1. 安装anaconda2. 检查更新显卡驱动3. 根据pytorch选择CUDA版本4. 安装CUDA5. 安装cuDNN6. conda安装pytorch结语 前言 建议有条件的&#xff0c;可以在安装过程中&#xff0c;开启梯子。例如cuDNN安装时登录 or 注册&#xff0c;会…

Linux-grep命令

grep 是一个强大的文本搜索工具&#xff0c;可以在文件中搜索指定的字符串模式&#xff0c;并将包含匹配的行打印出来。下面是 grep 命令的详细用法&#xff1a; grep [选项] 模式 [文件...] 选项&#xff1a;grep 命令支持多种选项&#xff0c;用于控制搜索行为&#xff0c;常…

十 超级数据查看器   讲解稿    详情5  隐藏功能

十 超级数据查看器 讲解稿 详情5 隐藏功能 app下载地址 百度手机助手 下载地址4 ​ 讲解稿全文&#xff1a; 第5讲 界面的隐藏功能 设置这些功能是为了方便用户操作 首先是编辑栏。长按一可以在一栏和二栏之间做切换&#xff0c;这个一、二、左箭头、右箭头&#xf…

(官网安装) 基于CentOS 7安装MangoDB和MangoDB Shell

前言 查了很多资料都不靠谱&#xff0c;在安装过程中遇到很多的坑&#xff0c;mangoDB 服务重视起不来&#xff1b;出现了很多难以解决的报错&#xff0c;现在把安装过程中遇到的问题&#xff0c;和如何闭坑说一下&#xff0c;很多时候都是准备工作不足导致的&#xff1b;很多方…

【Unity入门】详解Unity中的射线与射线检测

目录 前言一、射线的创建方法二、射线检测1、Raycast()Raycast()不使用射线RayRaycast()使用射线Ray 2、RaycastAll()使用射线RayRaycastAll() 不使用射线Ray 3、射线的碰撞信息 三、示例四、具体使用场景射线的调试方法1、Debug.DrawLine()2、Debug.DrawRay利用Gizmos 前言 碰…

利用生成式人工智能进行功能管理测试

就 DevOps 而言&#xff0c;生成式 AI与功能管理测试的新兴集成标志着一次重大演变。我们将认真研究这项技术如何彻底改变我们创建测试环境的方式。 使用人工智能生成测试使我们能够模拟大量的用户场景和环境&#xff0c;这意味着我们可以开发和部署不仅好而且很棒的功能&…

React 的 diff 算法

React 的 diff 算法的演进。 在 React 16 之前&#xff0c;React 使用的是称为 Reconciliation 的 diff 算法。Reconciliation 算法通过递归地比较新旧虚拟 DOM 树的每个节点&#xff0c;找出节点的差异&#xff0c;并将这些差异应用到实际的 DOM 上。整个过程是递归的&#x…

蓝桥杯day2刷题日记

由浅入深 P8717 [蓝桥杯 2020 省 AB2] 成绩分析 #include <iostream> using namespace std; int num; double sum; int maxs,mins; int n;int main() {mins1e9;maxs-1e9;sum0;cin>>n;for(int i0;i<n;i){cin>>num;sumnum;maxsmax(maxs,num);minsmin(mins…