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

一、前言

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


二、网络爬虫

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

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

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

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

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

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

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

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

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

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

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

三、简单的爬虫

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

3.1、爬取一个简单的网页

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

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

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

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

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

3.2、爬取网页中的图片

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

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

import re import requests # 要爬取的网站 url = # 获取网页源码 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实战

主站+href值 ,知道了这个我们就可以进行下一步的操作了,我们先从主站爬取跳转的url: ‍

import requests from bs4 import BeautifulSoup # 主站 url = # 模拟浏览器访问 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并组拼成完整的url video_url = video[ 'href' ] video_url = url + video_url print(video_url)

输出结果如下:

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

var contId= "1674906" ,liveStatusUrl= "liveStatus.jsp" ,liveSta= "" ,playSta= "1" ,autoPlay=! 1 ,isLiving=! 1 ,isVrVideo=! 1 ,hdflvUrl= "" ,sdflvUrl= "" ,hdUrl= "" ,sdUrl= "" ,ldUrl= "" ,srcUrl=,vdoUrl=srcUrl,skinRes=,videoCDN= "//video.pearvideo.com" ;

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

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

结果如下:

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

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

import re import requests from bs4 import BeautifulSoup # 主站 # 模拟浏览器访问 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)

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容