大家好,欢迎来到IT知识分享网。
其实在当今社会,网络上充斥着大量有用的数据,我们只需要耐心的观察,再加上一些技术手段,就可以获取到大量的有价值数据。这里的“技术手段”就是网络爬虫。今天就给大家分享一篇爬虫基础知识和入门教程:
什么是爬虫?
爬虫流程
模拟请求网页。模拟浏览器,打开目标网站。
获取数据。打开网站之后,就可以自动化的获取我们所需要的网站数据。
保存数据。拿到数据之后,需要持久化到本地文件或者数据库等存储设备中。
那么我们该如何使用 Python 来编写自己的爬虫程序呢,在这里我要重点介绍一个 Python 库:Requests。
Requests 使用
Requests 库是 Python 中发起 HTTP 请求的库,使用非常方便简单。
模拟发送 HTTP 请求
发送 GET 请求
当我们用浏览器打开豆瓣首页时,其实发送的最原始的请求就是 GET 请求
可以看到,我们得到的是一个 Response 对象
如果我们要获取网站返回的数据,可以使用 text 或者 content 属性来获取
text:是以字符串的形式返回数据
content:是以二进制的方式返回数据
print(type(res.text))
print(res.text)
>>>
<class ‘str’> <!DOCTYPE HTML>
<html lang=”zh-cmn-Hans” class=””>
<head>
<meta charset=”UTF-8″>
<meta name=”google-site-verification” content=”ok0wCgT20tBBgo9_zat2iAcimtN4Ftf5ccsh092Xeyw” />
<meta name=”description” content=”提供图书、电影、音乐唱片的推荐、评论和价格比较,以及城市独特的文化生活。”>
<meta name=”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 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36″,”Cookie”: “your cookie”}
res = requests.get(‘http://www.xxx.com’, headers=header)
解析 HTML
现在我们已经获取到了网页返回的数据,即 HTML 代码,下面就需要解析 HTML,来提取其中有效的信息。
BeautifulSoup
BeautifulSoup 是 Python 的一个库,最主要的功能是从网页解析数据。
from bs4 import BeautifulSoup # 导入 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()当前路径下的文本内容
一些简单的例子
爬虫实战:爬取豆瓣海报
https://movie.douban.com/celebrity//photos/
下面我们就来分析下这个网页
我们在任意一张图片上右击鼠标,选择“检查”,可以看到同样打开了“开发者工具”,而且自动定位到了该图片所在的位置
可以清晰的看到,每张图片都是保存在 li 标签中的,图片的地址保存在 li 标签中的 img 中。
知道了这些规律后,我们就可以通过 BeautifulSoup 或者 XPath 来解析 HTML 页面,从而获取其中的图片地址。
代码编写
我们只需要短短的几行代码,就能完成图片 url 的提取
https://movie.douban.com/celebrity//photos/?type=C&start=30&sortby=like&size=a&subtype=a
发现浏览器 url 增加了几个参数
再点击第三页,继续观察 url
https://movie.douban.com/celebrity//photos/?type=C&start=60&sortby=like&size=a&subtype=a
通过观察可知,这里的参数,只有 start 是变化的,即为变量,其余参数都可以按照常理来处理
同时还可以知道,这个 start 参数应该是起到了类似于 page 的作用,start = 30 是第二页,start = 60 是第三页,依次类推,最后一页是 start = 420。
于是我们处理分页的代码也呼之欲出了
首先将上面处理 HTML 页面的代码封装成函数
然后我们在另一个函数中处理分页和调用上面的函数
此时,我们所有的海报数据都保存在了 data 变量中,现在就需要一个下载器来保存海报了
再增加下载器到 fire 函数,此时为了不是请求过于频繁而影响豆瓣网的正常访问,设置 sleep time 为1秒
下面就执行 fire 函数,等待程序运行完成后,当前目录下会生成一个 picture 的文件夹,里面保存了我们下载的所有海报
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() 关闭文件
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/112450.html










