非常详细的python爬虫编程(python爬虫入门教程)

其实在当今社会,网络上充斥着大量有用的数据,我们只需要耐心的观察,再加上一些技术手段,就可以获取到大量的有价值数据。这里的“技术手段”就是网络爬虫。今天就给大家分享一篇爬虫基础知识和入门教程:什么是爬虫?爬虫就是自动获取网页内容的程序,

其实在当今社会,网络上充斥着大量有用的数据,我们只需要耐心的观察,再加上一些技术手段,就可以获取到大量的有价值数据。这里的“技术手段”就是网络爬虫。今天就给大家分享一篇爬虫基础知识和入门教程:

什么是爬虫?

爬虫就是自动获取网页内容的程序,例如搜索引擎,Google,Baidu 等,每天都运行着庞大的爬虫系统,从全世界的网站中爬虫数据,供用户检索时使用。

爬虫流程

其实把网络爬虫抽象开来看,它无外乎包含如下几个步骤

  • 模拟请求网页。模拟浏览器,打开目标网站。
  • 获取数据。打开网站之后,就可以自动化的获取我们所需要的网站数据。
  • 保存数据。拿到数据之后,需要持久化到本地文件或者数据库等存储设备中。

那么我们该如何使用 Python 来编写自己的爬虫程序呢,在这里我要重点介绍一个 Python 库:Requests。

Requests 使用

Requests 库是 Python 中发起 HTTP 请求的库,使用非常方便简单。

模拟发送 HTTP 请求

发送 GET 请求

当我们用浏览器打开豆瓣首页时,其实发送的最原始的请求就是 GET 请求

importrequests
res=requests.get(\'http://www.douban.com\')
print(res)
print(type(res))
>>>
<Response[200]>
<class\'requests.models.Response\'>

可以看到,我们得到的是一个 Response 对象

如果我们要获取网站返回的数据,可以使用 text 或者 content 属性来获取

text:是以字符串的形式返回数据

content:是以二进制的方式返回数据

print(type(res.text))
print(res.text)
>>>
<class\'str\'><!DOCTYPEHTML>
<htmllang=\"zh-cmn-Hans\"class=\"\">
<head>
<metacharset=\"UTF-8\">
<metaname=\"google-site-verification\"content=\"ok0wCgT20tBBgo9_zat2iAcimtN4Ftf5ccsh092Xeyw\"/>
<metaname=\"description\"content=\"提供图书、电影、音乐唱片的推荐、评论和价格比较,以及城市独特的文化生活。\">
<metaname=\"keywords\"content=\"豆瓣,广播,登陆豆瓣\">.....

发送 POST 请求

对于 POST 请求,一般就是提交一个表单

r=requests.post(\'http://www.xxxx.com\',data={\"key\":\"value\"})

data 当中,就是需要传递的表单信息,是一个字典类型的数据。

header 增强

对于有些网站,会拒绝掉没有携带 header 的请求的,所以需要做一些 header 增强。比如:UA,Cookie,host 等等信息。

header={\"User-Agent\":\"Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/76.0.3809.100Safari/537.36\",
\"Cookie\":\"yourcookie\"}
res=requests.get(\'http://www.xxx.com\',headers=header)

解析 HTML

现在我们已经获取到了网页返回的数据,即 HTML 代码,下面就需要解析 HTML,来提取其中有效的信息。

BeautifulSoup

BeautifulSoup 是 Python 的一个库,最主要的功能是从网页解析数据。

frombs4importBeautifulSoup#导入BeautifulSoup的方法
#可以传入一段字符串,或者传入一个文件句柄。一般都会先用 requests 库获取网页内容,然后使用 soup 解析。
soup=BeautifulSoup(html_doc,\'html.parser\')#这里一定要指定解析器,可以使用默认的 html,也可以使用 lxml。
print(soup.prettify())#按照标准的缩进格式输出获取的 soup 内容。

BeautifulSoup 的一些简单用法

print(soup.title)#获取文档的title
print(soup.title.name)#获取title的name属性
print(soup.title.string)#获取title的内容
print(soup.p)#获取文档中第一个p节点
print(soup.p[\'class\'])#获取第一个p节点的class内容
print(soup.find_all(\'a\'))#获取文档中所有的a节点,返回一个list
print(soup.find_all(\'span\',attrs={\'style\':\"color:#ff0000\"}))#获取文档中所有的span且style符合规则的节点,返回一个list

具体的用法和效果,我会在后面的实战中详细说明。

XPath 定位

XPath 是 XML 的路径语言,是通过元素和属性进行导航定位的。几种常用的表达式

表达式含义node选择 node 节点的所有子节点/从根节点选取//选取所有当前节点.当前节点..父节点@属性选取text()当前路径下的文本内容

一些简单的例子

xpath(\'node\')#选取node节点的所有子节点
xpath(\'/div\')#从根节点上选取div元素
xpath(\'//div\')#选取所有div元素
xpath(\'./div\')#选取当前节点下的div元素
xpath(\'//@id\')#选取所有id属性的节点

当然,XPath 非常强大,但是语法也相对复杂,不过我们可以通过 Chrome 的开发者工具来快速定位到元素的 xpath,如下图

非常详细的python爬虫编程(python爬虫入门教程)

得到的 xpath 为

//*[@id=\"anony-nav\"]/div[1]/ul/li[1]/a

在实际的使用过程中,到底使用 BeautifulSoup 还是 XPath,完全取决于个人喜好,哪个用起来更加熟练方便,就使用哪个。

爬虫实战:爬取豆瓣海报

我们可以从豆瓣影人页,进入都影人对应的影人图片页面,比如以刘涛为例子,她的影人图片页面地址为

https://movie.douban.com/celebrity/1011562/photos/

非常详细的python爬虫编程(python爬虫入门教程)

下面我们就来分析下这个网页

目标网站页面分析

注意:网络上的网站页面构成总是会变化的,所以这里你需要学会分析的方法,以此类推到其他网站。正所谓授人以鱼不如授人以渔,就是这个原因。

Chrome 开发者工具

Chrome 开发者工具(按 F12 打开),是分析网页的绝佳利器,一定要好好使用。

我们在任意一张图片上右击鼠标,选择“检查”,可以看到同样打开了“开发者工具”,而且自动定位到了该图片所在的位置

非常详细的python爬虫编程(python爬虫入门教程)

可以清晰的看到,每张图片都是保存在 li 标签中的,图片的地址保存在 li 标签中的 img 中。

知道了这些规律后,我们就可以通过 BeautifulSoup 或者 XPath 来解析 HTML 页面,从而获取其中的图片地址。

代码编写

我们只需要短短的几行代码,就能完成图片 url 的提取

importrequests
frombs4importBeautifulSoup
url=\'https://movie.douban.com/celebrity/1011562/photos/\'
res=requests.get(url).text
content=BeautifulSoup(res,\"html.parser\")
data=content.find_all(\'div\',attrs={\'class\':\'cover\'})
picture_list=[]
fordindata:
plist=d.find(\'img\')[\'src\']
picture_list.append(plist)
print(picture_list)
>>>
[\'https://img1.doubanio.com/view/photo/m/public/p2564834267.jpg\',\'https://img1.doubanio.com/view/photo/m/public/p860687617.jpg\',\'https://img1.doubanio.com/view/photo/m/public/p2174001857.jpg\',\'https://img1.doubanio.com/view/photo/m/public/p1563789129.jpg\',\'https://img3.doubanio.com/view/photo/m/public/p2363429946.jpg\',\'https://img1.doubanio.com/view/photo/m/public/p2382591759.jpg\',\'https://img3.doubanio.com/view/photo/m/public/p2363269182.jpg\',\'https://img1.doubanio.com/view/photo/m/public/p1959495269.jpg\',\'https://img3.doubanio.com/view/photo/m/public/p2356638830.jpg\',\'https://img3.doubanio.com/view/photo/m/public/p1959495471.jpg\',\'https://img3.doubanio.com/view/photo/m/public/p1834379290.jpg\',\'https://img3.doubanio.com/view/photo/m/public/p2325385303.jpg\',\'https://img3.doubanio.com/view/photo/m/public/p2361707270.jpg\',\'https://img3.doubanio.com/view/photo/m/public/p2325385321.jpg\',\'https://img3.doubanio.com/view/photo/m/public/p2196488184.jpg\',\'https://img1.doubanio.com/view/photo/m/public/p2186019528.jpg\',\'https://img1.doubanio.com/view/photo/m/public/p2363270277.jpg\',\'https://img3.doubanio.com/view/photo/m/public/p2325240501.jpg\',\'https://img1.doubanio.com/view/photo/m/public/p2258657168.jpg\',\'https://img1.doubanio.com/view/photo/m/public/p2319710627.jpg\',\'https://img3.doubanio.com/view/photo/m/public/p2319710591.jpg\',\'https://img3.doubanio.com/view/photo/m/public/p2311434791.jpg\',\'https://img1.doubanio.com/view/photo/m/public/p2363270708.jpg\',\'https://img3.doubanio.com/view/photo/m/public/p2258657185.jpg\',\'https://img3.doubanio.com/view/photo/m/public/p2166193915.jpg\',\'https://img3.doubanio.com/view/photo/m/public/p2363265595.jpg\',\'https://img3.doubanio.com/view/photo/m/public/p2312085755.jpg\',\'https://img3.doubanio.com/view/photo/m/public/p2311434790.jpg\',\'https://img3.doubanio.com/view/photo/m/public/p2276569205.jpg\',\'https://img1.doubanio.com/view/photo/m/public/p2165332728.jpg\']

可以看到,是非常干净的列表,里面存储了海报地址。但是这里也只是一页海报的数据,我们观察页面发现它有好多分页,如何处理分页呢。

非常详细的python爬虫编程(python爬虫入门教程)

分页处理

我们点击第二页,看看浏览器 url 的变化

https://movie.douban.com/celebrity/1011562/photos/?type=C&start=30&sortby=like&size=a&subtype=a

发现浏览器 url 增加了几个参数

再点击第三页,继续观察 url

https://movie.douban.com/celebrity/1011562/photos/?type=C&start=60&sortby=like&size=a&subtype=a

通过观察可知,这里的参数,只有 start 是变化的,即为变量,其余参数都可以按照常理来处理

同时还可以知道,这个 start 参数应该是起到了类似于 page 的作用,start = 30 是第二页,start = 60 是第三页,依次类推,最后一页是 start = 420。

于是我们处理分页的代码也呼之欲出了

首先将上面处理 HTML 页面的代码封装成函数

defget_poster_url(res):
content=BeautifulSoup(res,\"html.parser\")
data=content.find_all(\'div\',attrs={\'class\':\'cover\'})
picture_list=[]
fordindata:
plist=d.find(\'img\')[\'src\']
picture_list.append(plist)
returnpicture_list

然后我们在另一个函数中处理分页和调用上面的函数

deffire():
page=0
foriinrange(0,450,30):
print(\"开始爬取第%s 页\"%page)
url=\'https://movie.douban.com/celebrity/1011562/photos/?type=C&start={}&sortby=like&size=a&subtype=a\'.format(i)
res=requests.get(url).text
data=get_poster_url(res)
page+=1

此时,我们所有的海报数据都保存在了 data 变量中,现在就需要一个下载器来保存海报了

defdownload_picture(pic_l):
ifnotos.path.exists(r\'picture\'):
os.mkdir(r\'picture\')
foriinpic_l:
pic=requests.get(i)
p_name=i.split(\'/\')[7]
withopen(\'picture\'+p_name,\'wb\')asf:
f.write(pic.content)

再增加下载器到 fire 函数,此时为了不是请求过于频繁而影响豆瓣网的正常访问,设置 sleep time 为1秒

deffire():
page=0
foriinrange(0,450,30):
print(\"开始爬取第%s 页\"%page)
url=\'https://movie.douban.com/celebrity/1011562/photos/?type=C&start={}&sortby=like&size=a&subtype=a\'.format(i)
res=requests.get(url).text
data=get_poster_url(res)
download_picture(data)
page+=1
time.sleep(1)

下面就执行 fire 函数,等待程序运行完成后,当前目录下会生成一个 picture 的文件夹,里面保存了我们下载的所有海报

非常详细的python爬虫编程(python爬虫入门教程)

核心代码讲解

下面再来看下完整的代码

importrequests
frombs4importBeautifulSoup
importtime
importosdeffire():
page=0
foriinrange(0,450,30):
print(\"开始爬取第%s 页\"%page)
url=\'https://movie.douban.com/celebrity/1011562/photos/?type=C&start={}&sortby=like&size=a&subtype=a\'.format(i)
res=requests.get(url).text
data=get_poster_url(res)
download_picture(data)
page+=1
time.sleep(1)defget_poster_url(res):
content=BeautifulSoup(res,\"html.parser\")
data=content.find_all(\'div\',attrs={\'class\':\'cover\'})
picture_list=[]
fordindata:
plist=d.find(\'img\')[\'src\']
picture_list.append(plist)
returnpicture_listdefdownload_picture(pic_l):
ifnotos.path.exists(r\'picture\'):
os.mkdir(r\'picture\')
foriinpic_l:
pic=requests.get(i)
p_name=i.split(\'/\')[7]
withopen(\'picture\'+p_name,\'wb\')asf:
f.write(pic.content)if__name__==\'__main__\':
fire()

fire 函数

这是一个主执行函数,使用 range 函数来处理分页。

  • range 函数可以快速的创建整数列表,在 for 循环时及其好用。函数中的0代表从0开始计数,450代表一直迭代到450,不包含450,30代表步长,即每次递增的数字间隔。range(0, 450, 30),依次会输出:0,30,60,90 …
  • format 函数,是一种字符串格式化方式
  • time.sleep(1) 即为暂停1秒钟

get_poster_url 函数

这个就是解析 HTML 的函数,使用的是 BeautifulSoup

  • 通过 find_all 方法查找所有 class 为 “cover” 的 div 元素,返回的是一个列表
  • 使用 for 循环,循环上一步拿到的列表,取出 src 的内容,append 到列表中
  • append 是列表的一个方法,可以在列表后面追加元素

download_picture 函数

简易图片下载器

  • 首先判断当前目录下是否存在 picture 文件夹,os.path.exists
  • os 库是非常常用用来操作系统相关的命令库,os.mkdir 就是创建文件夹
  • split 用于切割字符串,取出角标为7的元素,作为存储图片的名称
  • with 方法用来快速打开文件,打开的进程可以自行关闭文件句柄,而不再需要手动执行 f.close() 关闭文件

总结

本节讲解了爬虫的基本流程以及需要用到的 Python 库和方法,并通过一个实际的例子完成了从分析网页,到数据存储的全过程。其实爬虫,无外乎模拟请求,解析数据,保存数据。

当然有的时候,网站还会设置各种反爬机制,比如 cookie 校验,请求频度检查,非浏览器访问限制,JS 混淆等等,这个时候就需要用到反反爬技术了,比如抓取 cookie 放到 headers 中,使用代理 IP 访问,使用 Selenium 模拟浏览器等待方式。

由于本课程不是专门的爬虫课,这些技能就留待你自己去探索挖掘啦。

非常详细的python爬虫编程(python爬虫入门教程)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请发送邮件至 55@qq.com 举报,一经查实,本站将立刻删除。转转请注明出处:https://www.szhjjp.com/n/62181.html

(0)
nan
上一篇 2021-12-12
下一篇 2021-12-12

相关推荐

  • ai混合工具如何使用(ai的混合工具怎么用)

    ai混合工具如何使用,ai的混合工具怎么用内容导航:AI中混合工具怎么使用AI中的混合工具怎么用啊ai里用了混合工具后怎么实时上AI中混合工具和对象中的混合的区别一、AI中混合工具怎么使用CDR软件你会用不?AI中的混合工具和CDR中的互动式渐变工具类似,是从一个物件到另一个物体

    2022-04-24
    0
  • 使用Docker提高Python开发效率

    使用Docker可以帮助提高Python开发效率的几个方面包括:隔离开发环境:使用Docker可以在不同的容器中运行不同版本的Python和依赖库,避免了不同项目之间的环境冲突。简化部署过程:使用Docker可以将应用程序和其依赖项打包到一个容器中,使得部署过程变得简单和可重复。快速构建和部署:Docker容器可以快速启动和停止,使得开发人员可以快速构建和测试代码,提高开发效率。提高团队协作效率:

    2024-04-25
    0
  • python打印对象的方法有哪些

    在Python中,可以使用以下方法来打印对象:使用print()函数:最简单直接的方法是使用print()函数来打印对象,例如:print(obj)使用str()函数:调用对象的__str__()方法来得到对象的字符串表示,然后使用print()函数来打印这个字符串,例如:print(str(obj))使用repr()函数:调用对象的__repr__()方法来得到对象的“官方”字符串表示,然后使用

    2024-03-21
    0
  • 美国服务器的功能是什么

    美国服务器的功能与其他国家的服务器一样,主要用于存储数据、托管网站、提供云计算服务等。具体功能包括但不限于:存储数据:美国服务器可以存储用户的文件、图片、视频等数据,确保数据的安全和可靠性。托管网站:企业和个人可以将自己的网站托管在美国服务器上,确保网站的稳定性和访问速度。提供云计算服务:美国服务器可以提供云存储、云计算等服务,帮助用户高效地管理和利用数据。数据备份:美国服务器可以用于数据备

    2024-04-26
    0
  • 市场细分的条件是什么(市场细分的基本要求是什么)

    市场细分的条件是什么,市场细分的基本要求是什么内容导航:有效市场细分必须满足的条件是什么简述市场细分的有效条件市场细分的条件和标准是什么有效市场细分的条件是什么一、有效市场细分必须满足的条件是什么

    2022-05-14
    0
  • 为什么不能上百度网页(其他网页都能上百度上不了)

    为什么不能上百度网页,其他网页都能上百度上不了内容导航:电脑百度网页打不开怎么办我的电脑打不开百度网页了请指教为什么我的百度页面不能搜索网页了美仙居农家乐咋样才能上百度网页<br>一、电脑百度网页打不开怎么办通常由于电脑的DNS解析出现问题,所以才会导致网页打不开。清除DNS解析缓存,系统一般会缓存平时常用的

    2022-04-16
    0

发表回复

登录后才能评论