作者 | ZackSock

来源 | 新建文件夹X(ID:ZackSock)

头图 | CSDN下载自视觉中国

前言

爬虫一直是Python的一大应用场景,差不多每门语言都可以写爬虫,但是程序员们却独爱Python。之所以偏爱Python就是因为她简洁的语法,我们使用Python可以很简单的写出一个爬虫程序。本篇博客将以Python语言,用几个非常简单的例子带大家入门Python爬虫。

网络爬虫

如果把我们的因特网比作一张复杂的蜘蛛网的话,那我们的爬虫就是一个蜘,我们可以让这个蜘蛛在网上任意爬行,在网中寻找对我们有价值的“猎物”。

首先我们的网络爬虫是建立在网络之上的,所以网络爬虫的基础就是网络请求。在我们日常生活中,我们会使用浏览器浏览网页,我们在网址栏输入一个网址,点击回车在几秒时间后就能显示一个网页。

我们表面上是点击了几个按钮,实际上浏览器帮我们完成了一些了的操作,具体操作有如下几个:

1.向服务器发送网络请求

2.浏览器接收并处理你的请求

3.浏览器返回你需要的数据

4.浏览器解析数据,并以网页的形式展现出来

我们可以将上面的过程类比我们的日常购物:

1.和老板说我要杯珍珠奶茶

2.老板在店里看看有没有你要的东西

3.老板拿出做奶茶的材料

4.老板将材料做成奶茶并给你

上面买奶茶的例子虽然有些不恰当的地方,但是我觉得已经能很好的解释什么是网络请求了。在知道网络请求是什么之后,我们就可以来了解一下什么是爬虫了。实际上爬虫也是网络请求,通常情况下我们通过浏览器,而我们的爬虫则是通过程序来模拟网络请求这一过程。但是这种基础的网络请求还算不上是爬虫,爬虫通常都是有目的的。比如我想写一个爬取美女图片,我们就需要对我们请求到的数据进行一些筛选、匹配,找到对我们有价值的数据。而这一从网络请求到数据爬取这整个过程才是一个完整的爬虫。有些时候网站的反爬虫做的比较差,我们可以直接在浏览器中找到它的API,我们通过API可以直接获取我们需要的数据,这种相比就要简单许多。

简单的爬虫

简单的爬虫就是单纯的网络请求,也可以对请求的数据进行一些简单的处理。Python提供了原生的网络请求模块urllib,还有封装版的requests模块。相比直线requests要更加方便好用,所以本文使用requests进行网络请求。

3.1、爬取一个简单的网页

在我们发送请求的时候,返回的数据多种多样,有HTML代码、json数据、xml数据,还有二进制流。我们先以百度首页为例,进行爬取:

import requests
# 以get方法发送请求,返回数据
response = requests.get('http://www.baidu.com')
# 以二进制写入的方式打开一个文件
f = open('index.html', 'wb')
# 将响应的字节流写入文件
f.write(response.content)
# 关闭文件
f.close()

下面我们看看爬取的网站打开是什么样子的:

这就是我们熟悉的百度页面,上面看起来还是比较完整的。我们再以其它网站为例,可以就是不同的效果了,我们以CSDN为例:

可以看到页面的布局已经完全乱了,而且也丢失了很多东西。学过前端的都知道,一个网页是由html页面还有许多静态文件构成的,而我们爬取的时候只是将HTML代码爬取下来,HTML中链接的静态资源,像css样式和图片文件等都没有爬取,所以会看到这种很奇怪的页面。

3.2、爬取网页中的图片

首先我们需要明确一点,在爬取一些简单的网页时,我们爬取图片或者视频就是匹配出网页中包含的url信息,也就是我们说的网址。然后我们通过这个具体的url进行图片的下载,这样就完成了图片的爬取。我们有如下url:https://img-blog.csdnimg.cn/2020051614361339.jpg,我们将这个图片url来演示下载图片的代码:

import requests
# 准备url
url = 'https://img-blog.csdnimg.cn/2020051614361339.jpg'
# 发送get请求
response = requests.get(url)
# 以二进制写入的方式打开图片文件
f = open('test.jpg', 'wb')
# 将文件流写入图片
f.write(response.content)
# 关闭文件
f.close()

可以看到,代码和上面网页爬取是一样的,只是打开的文件后缀为jpg。实际上图片、视频、音频这种文件用二进制写入的方式比较恰当,而对应html代码这种文本信息,我们通常直接获取它的文本,获取方式为response.text,在我们获取文本后就可以匹配其中的图片url了。我们以下列http://topit.pro为例:

import re
import requests
# 要爬取的网站
url = 'http://topit.pro'
# 获取网页源码
response = requests.get(url)
# 匹配源码中的图片资源
results = re.findall("<img[\\s\\S]+?src=\"(.+?)\"", response.text)
# 用于命名的变量
name = 0
# 遍历结果
for result in results:# 在源码中分析出图片资源写的是绝对路径,所以完整url是主站+绝对路径img_url = url+result# 下载图片f = open(str(name) + '.jpg', 'wb')f.write(requests.get(img_url).content)f.close()name += 1

上面我们就完成了一个网站的爬取。在匹配时我们用到了正则表达式,因为正则的内容比较多,在这里就不展开了,有兴趣的读者可以自己去了解一下,这里只说一个简单的。Python使用正则是通过re模块实现的,可以调用findall匹配文本中所有符合要求的字符串。该函数传入两个参数,第一个为正则表达式,第二个为要匹配的字符串,对正则不了解的话只需要知道我们使用该正则可以将图片中的src内容拿出来。

使用BeautifulSoup解析HTML

BeautifulSoup是一个用来分析XML文件和HTML文件的模块,我们前面使用正则表达式进行模式匹配,但自己写正则表达式是一个比较繁琐的过程,而且容易出错。如果我们把解析工作交给BeautifulSoup会大大减少我们的工作量,在使用之前我们先安装。

4.1、BeautifulSoup的安装和简单使用

我们直接使用pip安装:‍ 

pip install beautifulsoup4

模块的导入如下:‍‍‍ 

from bs4 import BeautifulSoup

下面我们就来看看BeautifulSoup的使用,我们用下面HTML文件测试:‍ 

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><img class="test" src="1.jpg"><img class="test" src="2.jpg"><img class="test" src="3.jpg"><img class="test" src="4.jpg"><img class="test" src="5.jpg"><img class="test" src="6.jpg"><img class="test" src="7.jpg"><img class="test" src="8.jpg">
</body>
</html>

上面是一个非常简答的html页面,body内包含了8个img标签,现在我们需要获取它们的src,代码如下:

from bs4 import BeautifulSoup# 读取html文件
f = open('test.html', 'r')
str = f.read()
f.close()# 创建BeautifulSoup对象,第一个参数为解析的字符串,第二个参数为解析器
soup = BeautifulSoup(str, 'html.parser')# 匹配内容,第一个为标签名称,第二个为限定属性,下面表示匹配class为test的img标签
img_list = soup.find_all('img', {'class':'test'})# 遍历标签
for img in img_list:# 获取img标签的src值src = img['src']print(src)

解析结果如下:‍ 

1.jpg
2.jpg
3.jpg
4.jpg
5.jpg
6.jpg
7.jpg
8.jpg

正好就是我们需要的内容。

4.2、BeautifulSoup实战

我们可以针对网页进行解析,解析出其中的src,这样我们就可以进行图片等资源文件的爬取。下面我们用梨视频为例,进行视频的爬取。主页网址如下:https://www.pearvideo.com/。我们右键检查可以看到如下页面:

我们可以先点击1处,然后选择需要爬取的位置,比如2,在右边就会跳转到相应的位置。我们可以看到外层套了一个a标签,在我们实际操作是发现点击2的位置跳转了网页,分析出来跳转的网页应该就是a标签中的herf值。因为herf值是以/开头的,所以完整的URL应该是主站+href值,知道了这个我们就可以进行下一步的操作了,我们先从主站爬取跳转的url:‍ 

import requests
from bs4 import BeautifulSoup
# 主站
url = 'https://www.pearvideo.com/'
# 模拟浏览器访问
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'
}
# 发送请求
response = requests.get(url, headers=headers)
# 获取BeautifulSoup对象
soup = BeautifulSoup(response.text, 'html.parser')
# 解析出符合要求的a标签
video_list = soup.find_all('a', {'class':'actwapslide-link'})
# 遍历标签
for video in video_list:# 获取herf并组拼成完整的urlvideo_url = video['href']video_url = url + video_urlprint(video_url)

输出结果如下:

https://www.pearvideo.com/video_1674906
https://www.pearvideo.com/video_1674921
https://www.pearvideo.com/video_1674905
https://www.pearvideo.com/video_1641829
https://www.pearvideo.com/video_1674822

我们只爬取一个就好了,我们进入第一个网址查看源码,发现了这么一句:

var contId="1674906",liveStatusUrl="liveStatus.jsp",liveSta="",playSta="1",autoPlay=!1,isLiving=!1,isVrVideo=!1,hdflvUrl="",sdflvUrl="",hdUrl="",sdUrl="",ldUrl="",srcUrl="https://video.pearvideo.com/mp4/adshort/20200517/cont-1674906-15146856_adpkg-ad_hd.mp4",vdoUrl=srcUrl,skinRes="//www.pearvideo.com/domain/skin",videoCDN="//video.pearvideo.com";

其中srcUrl就包含了视频文件的网站,但是我们肯定不能自己一个网页一个网页自己找,我们可以使用正则表达式:

import re
# 获取单个视频网页的源码
response = requests.get(video_url)
# 匹配视频网址
results = re.findall('srcUrl="(.*?)"', response.text)
# 输出结果
print(results)

结果如下:

['https://video.pearvideo.com/mp4/adshort/20200516/cont-1674822-14379289-191950_adpkg-ad_hd.mp4'

然后我们就可以下载这个视频了:

with open('result.mp4', 'wb') as f:f.write(requests.get(results[0], headers=headers).content)

完整代码如下:‍ 

import re
import requests
from bs4 import BeautifulSoup
# 主站
url = 'https://www.pearvideo.com/'
# 模拟浏览器访问
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'
}
# 发送请求
response = requests.get(url, headers=headers)
# 获取BeautifulSoup对象
soup = BeautifulSoup(response.text, 'html.parser')
# 解析出符合要求的a标签
video_list = soup.find_all('a', {'class':'actwapslide-link'})
# 遍历标签
video_url = video_list[0]['href']response = requests.get(video_url)results = re.findall('srcUrl="(.*?)"', response.text)with open('result.mp4', 'wb') as f:f.write(requests.get(results[0], headers=headers).content)

到此我们就从简单的网页到图片再到视频实现了几个不同的爬虫。

更多精彩推荐
☞什么?性能强大的 M1 芯片不支持 Docker ?
☞首次公开!阿里巴巴云原生实时数仓核心技术揭秘
☞起底 Windows 35 年发展史
☞赠书 | 新手指南——如何通过HuggingFace Transformer整合表格数据
☞想在边缘运行计算机视觉程序?先来迎接挑战!
☞《中国区块链发展报告(2020)》导读:全球区块链政策及监管重点趋势
点分享点点赞点在看

用几个最简单的例子带你入门 Python 爬虫相关推荐

  1. 图解爬虫,用几个最简单的例子带你入门Python爬虫

    一.前言 爬虫一直是Python的一大应用场景,差不多每门语言都可以写爬虫,但是程序员们却独爱Python.之所以偏爱Python就是因为她简洁的语法,我们使用Python可以很简单的写出一个爬虫程序 ...

  2. 带你入门Python爬虫

    点击关注我哦 一篇文章带你了解Python爬虫 数据科学只有通过数据才能实现,而在现实世界中,数据通常不会有现成的.csv文件等你使用.你必须去自己寻找.这就是为什么爬虫对数据科学非常重要的原因. 但 ...

  3. 王者荣耀五周年,带你入门Python爬虫基础操作(102个英雄+326款皮肤)

    简单的目录 1.概述 2.网页分析 2.1.html页面源数据 2.2.json源数据 3.数据请求 4.数据解析 4.1.html数据解析 4.1.1.bs4 4.1.2.xpath 4.2.jso ...

  4. 王者荣耀五周年,带你入门Python爬虫基础操作!

    1.概述 <王者荣耀>上线至今5个年头了,作为这些年国内最热门的手游(没有之一),除了带来游戏娱乐之外,我们在这五周年之际,试着从他们的官网找点乐趣,学习一下Python爬虫的一些简单基础 ...

  5. python中self_一个例子带你入门Python装饰器

    ============ 欢迎关注我的公众号:早起python ============ 前言 在还未正式发布的python3.9中,有一个新功能值得关注,那就是任意表达式可以作为装饰器,如果你还不知 ...

  6. 手把手带你入门Python爬虫(四、ORM与peewee)

    ORM与peewee 一.为什么要用ORM 二.ORM的选择 三.peewee使用 1. 安装 2. 创建并使用 3. 增删查改 (1) 新增 (2) 查询数据 (3) 修改数据 (4) 删除数据 一 ...

  7. 手把手带你入门Python爬虫(二、爬虫预备知识)

    爬虫预备知识 一.计算机网络协议基础 二.Html.Css.Javascript Ajax 异步加载 GET请求 与 POST请求 3种content-type 三.爬虫基本方法 1. 采集方案分类 ...

  8. 手把手带你入门Python爬虫(五、CSDN论坛之模型设计)

    CSDN论坛之模型设计 一.CSDN论坛分析 二.模型设计与数据表设计 一.CSDN论坛分析 论坛主题列表页: 详情页: 博主个人详情页: 我们根据以上页面分析我们需要抓取的数据,然后设计模型. 二. ...

  9. 手把手带你入门Python爬虫(三、PyMySQL)

    PyMySQL 1.安装 2.新建Mysql数据表 3.使用pymysql 1.安装 pip install PyMySQL 2.新建Mysql数据表 使用Navcat for Mysql 创建数据库 ...

最新文章

  1. 一个简单express+jade+mysql+bootstrap+nodejs的demo
  2. Survey | 生物医学文本挖掘最新进展
  3. Modernizr:HTML5和CSS3的开发利器
  4. 荒岛余生最后一个包裹_荒岛余生——每个人都是一座“孤岛”
  5. 64位linux安装mysql数据库吗_CentOS7 64位安装mysql教程
  6. 实现暂停一秒输出的效果_从暂停游戏联想到的
  7. 聊一聊声明式接口调用与Nacos的结合使用
  8. javascript学习系列(23):数组中的解构方法
  9. Android 8.0 学习(3)---Android Treble
  10. MyCat 数据库分片极简体验
  11. 关于sources.list和apt-get [转载]
  12. 频谱感知2:衰落信道上未知信号的能量检测
  13. matlab中如何去掉多行注释_matlab注释多行的方法
  14. Python使用combinations实现排列组合
  15. HDU3966 树链剖分
  16. Guarded Suspension 设计模式
  17. 欺骗的艺术——第二部分(11)
  18. 云计算,终将成为阿里和腾讯之争?
  19. polished_project 源码分析 知识点总结
  20. QCC3040 USB Composite Device: Audio+HID+CDC/虚拟串口

热门文章

  1. 【编程珠玑】第七章 粗略估算
  2. 敏捷开发一千零一问系列之六:业务人员怎样参与开发?
  3. day、11闭包函数和装饰器
  4. 《学习之道》第十章方法空间能力是可以后天形成的
  5. 编译 OpenWrt/LEDE 基本过程
  6. Mac NVM 配置
  7. 根据导出的查询结果拼接字符串,生成sql语句并保存到txt文件中
  8. Activity去Title的几种方式
  9. DenyHosts安装及配置
  10. java字节码指令集简介