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 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)

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java代码审计安全篇-XXE(XML外部实体注入)漏洞

前言&#xff1a; 堕落了三个月&#xff0c;现在因为被找实习而困扰&#xff0c;着实自己能力不足&#xff0c;从今天开始 每天沉淀一点点 &#xff0c;准备秋招 加油 注意&#xff1a; 本文章参考qax的网络安全java代码审计&#xff0c;记录自己的学习过程&#xff0c;还希望各…

sql join

-- 创建事实表 CREATE TABLE product_facts (id INT AUTO_INCREMENT PRIMARY KEY,product_name VARCHAR(255),price DECIMAL(10, 2) );-- 插入数据 INSERT INTO product_facts (product_name, price) VALUES (Product A, 100.00); INSERT INTO product_facts (product_name, pr…

【MySQL】MySQL事务

文章目录 一、CURD不加控制&#xff0c;会有什么问题&#xff1f;二、事务的概念三、事务出现的原因四、事务的版本支持五、事务提交方式六、事务常见操作方式七、事务隔离级别1.理解隔离性12.隔离级别3.查看与设置隔离性4.读未提交【Read Uncommitted】5.读提交【Read Committ…

OpenCV-Java 开发简介

返回目录&#xff1a;OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a;如何在“Microsoft Visual Studio”中使用OpenCV编译应用程序 下一篇&#xff1a;如何将OpenCV Java 与Eclipse结合使用 警告&#xff1a; 本教程可能包含过时的信息。 …

OLAP与数据仓库和数据湖

OLAP与数据仓库和数据湖 本文阐述了OLAP、数据仓库和数据湖方面的基础知识以及相关论文。同时记录了我如何通过ChatGPT以及类似产品&#xff08;通义千问、文心一言&#xff09;来学习知识的。通过这个过程让我对于用AI科技提升学习和工作效率有了实践经验和切身感受。 预热 …

长连接技术

个人学习记录&#xff0c;欢迎指正 1.轮询 1.1 轮询的形式 短连接轮询 前端每隔一段时间向服务端发起一次Http请求来获取数据。 const shortPolling () > { const intervalHandler setInterval(() > {fetch(/xxx/yyy).then(response > response.json()).then(respo…

Python图像处理【23】分布式图像处理

分布式图像处理 0. 前言1. Dask 简介2. 使用 Dask 进行分布式图像处理2.1 将 RGB 图像块转换为灰度图像块2.2 使用分布式 Sobel 滤波器检测图像边缘 小结系列链接 0. 前言 Python 已逐渐成为数据分析/处理领域中的主要语言&#xff0c;这得益于 Python 丰富的第三方库&#xf…

浅谈RPC的理解

浅谈RPC的理解 前言RPC体系Dubbo架构最后 前言 本文中部分知识涉及Dubbo&#xff0c;需要对Dubbo有一定的理解&#xff0c;且对源码有一定了解 如果不了解&#xff0c;可以参考学习我之前的文章&#xff1a; 浅谈Spring整合Dubbo源码&#xff08;Service和Reference注解部分&am…

C#,图论与图算法,无向图(Graph)回环(Cycle)的不相交集(disjoint)或并集查找(union find)判别算法与源代码

1 回环(Cycle)的不相交集(disjoint)或并集 不相交集数据结构是一种数据结构,它跟踪划分为多个不相交(非重叠)子集的一组元素。联合查找算法是对此类数据结构执行两个有用操作的算法: 查找:确定特定元素所在的子集。这可用于确定两个元素是否在同一子集中。 并集:将…

Linux 时间系统调用

UNIX及LinuxQ的时间系统是由「新纪元时间」Epoch开始计算起。Epoch是指定为1970年1月1日凌晨零点零分零秒&#xff0c;格林威治时间。目前大部份的UNX系统都是用32位来记录时间&#xff0c;正值表示为1970以后&#xff0c;负值则表示1970年以前。 对于当前时间到Epoch 我们用两…

Django项目创建和settings设置

2021版本的pycharm有bug,需要将settings.py中 把BASE_DIR后面的/换成, url:统一资源定位符 互联网上每个文件都有一个唯一的url,它包含的信息指出文件的位置以及浏览器应该怎么处理它 语法: protocol://hostname[:port]/path[?query][#fragment] protocol:协议 hostname:主…

【网络】负载均衡

OSI模型每一层的负载均衡 在OSI模型中&#xff0c;每一层的负载均衡具体如下&#xff1a; 1. 第二层&#xff08;数据链路层&#xff09;&#xff1a;数据链路层的负载均衡通常涉及对MAC地址的操作。在这一层&#xff0c;可以使用虚拟MAC地址技术&#xff0c;外部设备对虚拟MA…

MongoDB 可调节的一致性,其他数据库都不行系列 (白皮书 翻译)--2

开头还是介绍一下群&#xff0c;如果感兴趣PolarDB ,MongoDB ,MySQL ,PostgreSQL ,Redis, Oceanbase, Sql Server等有问题&#xff0c;有需求都可以加群群内有各大数据库行业大咖&#xff0c;CTO&#xff0c;可以解决你的问题。加群请联系 liuaustin3 &#xff0c;&#xff08;…

分布式搜索引擎(3)

1.数据聚合 **[聚合&#xff08;](https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations.html)[aggregations](https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations.html)[&#xff09;](https://www.ela…

ASP.NET 服务器控件

目录 一、使用的软件 1、下载 2、新建文件&#xff08;写一个简单的web网页&#xff09; 二、相关知识点 1、Web窗体网页的组件 &#xff08;1&#xff09;可视化组件 &#xff08;2&#xff09;用户接口逻辑 2、Web Form网页的代码模型 &#xff08;1&#xff09;单文件…

Github: Github actions自动化工作原理与多workflow创建和部署

Github actions 1 &#xff09;概述 Github Actions 是Github官方推出的 CI/CD 解决方案 https://docs.githu.com/en/actions 优点 自动发布流程可减少发布过程中手动操作成本&#xff0c;大幅提升ci/cd效率&#xff0c;快速实现项目发布上线 缺点 存在较高的技术门槛需要利用…

鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:GridRow)

栅格布局可以为布局提供规律性的结构&#xff0c;解决多尺寸多设备的动态布局问题&#xff0c;保证不同设备上各个模块的布局一致性。 栅格容器组件&#xff0c;仅可以和栅格子组件(GridCol)在栅格布局场景中使用。 说明&#xff1a; 该组件从API Version 9开始支持。后续版本…

【Java基础知识总结 | 第三篇】深入理解分析ArrayList源码

文章目录 3.深入理解分析ArrayList源码3.1ArrayList简介3.2ArrayLisy和Vector的区别&#xff1f;3.3ArrayList核心源码解读3.3.1ArrayList存储机制&#xff08;1&#xff09;构造函数&#xff08;2&#xff09;add()方法&#xff08;3&#xff09;新增元素大体流程 3.3.2ArrayL…

每日五道java面试题之mybatis篇(一)

目录&#xff1a; 第一题. MyBatis是什么&#xff1f;第二题. ORM是什么?第三题. 为什么说Mybatis是半自动ORM映射工具&#xff1f;它与全自动的区别在哪里&#xff1f;第四题. 传统JDBC开发存在的问题第五题. JDBC编程有哪些不足之处&#xff0c;MyBatis是如何解决这些问题的…

simulink汽车动力特性模型

1、内容简介 略 76-可以交流、咨询、答疑 simulink汽车动力特性模型 节气门、Gasoline Engine、离合器、作动器 2、内容说明 略 齿轮半径1 0.06; 齿轮半径2 0.072; 有效齿轮半径 2/3*(radius2^3 - radius1^3)/(radius2^2 - radius1^2); 输入传动比 2.1; 输出传动比 1…