战略地位极其重要
通常来说,我们获取数据使我们的第一步,也是我们最重要的一步,因为有些数据藏得很深,或者是有反爬机制,相比之下数据清洗和数据存储操作比较简单。
反爬就是我们访问浏览器地址,不能获取到网页上的内容,他可能是使用ajax传输的,也可能是使用js加密的,也可能是判断请求头的,多种多样,我们写爬虫最重要的一步就是找到真正的资源地址!!!
开启requests之路
我们新手学习建议使用python的requests库去访问地址获取数据,不因为别的,就因为他很简单,下面是官方文档给的介绍。。。
文档地址:https://requests.readthedocs.io/zh_CN/latest/user/quickstart.html
在这里我们可以学习基础用法,大家其实可以直接跳转到这个界面去学习了,因为他说的很棒啊!
我下面会用一个简单的例子介绍一些常用的用法。
一些参数解释
我们在寻找数据的时候,通常会用浏览器的F12开发者工具,在此对一些参数进行简单介绍。
按下F12之后,右侧会弹出框框,我们选择Network,当我们发起请求的时候,服务器传回来的东西都会在这里显示,通常情况下,Nmae下的第一个就是我们请求的地址
- Elements:heml的网页的结构
- Network:显示网络传输的过程部分
- Name:发起的请求
- Headers:发起请求的基本信息
- Headers - Request URL:问号前面的我们请求的服务器,后面是我们请求的参数
- Headers - Request Method:请求的方式,分为get请求与post请求,通常为get请求。根据请求不同,使用的方法也不同(只有一个函数要改)
- Headers -Status Code:200代表请求成功,404代表请求失败。(301、302、400、403、500大家自己有兴趣可以看看)
- Headers - Request Headers:请求头信息,有的服务器会判断你的请求头进行反爬。经过我几次试验,我发现,有反爬的网站大部分写了这些也没用。。。
- Headers - Query String Parameters:请求的参数
- Preview:将服务器返回到的资源进行展示
- Response:显示服务器返回的资源
开始获取资源
众所周知,李清照的诗词婉转凄美,意蕴悠长,帅帅龙是她忠实的粉丝,我们今天就以获取李清照诗集为例,贯穿我们爬虫速成的始终
获取数据必须要有个意识!观察url的变化
我们来到古诗词网https://www.gushiwen.org/ ,哇,这个网站真是简约而不简单,朴素而有韵味,现代气息中透露着远古的深沉,真的棒!
按下F12观察数据传输,搜索李清照,进入诗词界面,url变化啦!!!
https://so.gushiwen.cn/search.aspx?value=%E6%9D%8E%E6%B8%85%E7%85%A7
大家可以看到,网站上的url是value=李清照,但是复制下来后就变成了value=%E6%9D%8E%E6%B8%85%E7%85%A7,这是因为url有自己的编码方式,汉字会转化为固定的编码,大家可以使用urllib的parse类的urlencode方法尝试将文字进行编码
判断是否有反爬机制
我们打开F12,重新进入古诗词,搜索李清照,找到发起的请求,如下
发现地址为https://so.gushiwen.cn/search.aspx?value=%E6%9D%8E%E6%B8%85%E7%85%A7,请求方式为get。我们先使用爬虫请求一下这个页面,看看有没有反爬,是不是能直接获取资源,代码如下
import requests
url='https://so.gushiwen.cn/search.aspx?value=%E6%9D%8E%E6%B8%85%E7%85%A7'
response = requests.get(url)
print(response) # 查看请求状态,200就是成功。
response = response.text
print(response)
我们搜一下网页上的信息,看看有没有
通过使用键盘和鼠标,我们发现,可以直接访问到网页资源!这证明这个网站没有反爬机制 ,兄弟萌,看懂掌声!!!
到这里,我们的数据获取就成功了哦,是不是很简单?几行代码搞定!!!
获取全部诗集资源
前面已经说了,获取数据必须要有个意识!观察url的变化 ,我们滑到最下面,点击下一页,观察第二页、第三页、第四页网址规律。
# 首页
https://so.gushiwen.cn/search.aspx?value=%E6%9D%8E%E6%B8%85%E7%85%A7
# 第二页
https://so.gushiwen.cn/search.aspx?type=author&page=2&value=%e6%9d%8e%e6%b8%85%e7%85%a7
# 第三页
https://so.gushiwen.cn/search.aspx?type=author&page=3&value=%e6%9d%8e%e6%b8%85%e7%85%a7
兄弟萌!规律是不是很简单???
我们发现只有page发生变化了(大多数都是类似的),我们这时候可以暗自窃喜了,我们已经发现了不该发现的东西。
剩下的是不是只要做一个循环,每次都page+=1就好了呀!!!
这时候我们就思考,第一页是不是也是这种规律呢?
我们点上一页回去
https://so.gushiwen.cn/search.aspx?type=author&page=1&value=%e6%9d%8e%e6%b8%85%e7%85%a7
发现,也符合这个规律哦,就类似网页映射(没听过就当我没说)
Webdriver:最强有力的依赖
网站通常会有反爬机制,如果你不想解决繁琐的加密方法,就直接使用webdriver就好了,他不是模拟浏览器了,他就是一个浏览器,只不过是被我们写代码操纵的。
注意事项:
-
作为一个爬虫程序员,webdriver是我们最后的倔强,如果不能解决,请准备好红包来找我❤️
-
webdriver分为两个东东,浏览器和浏览器的driver,这个需要配套的,需要安装对应版本的浏览器和driver,建议使用Chrom,F12方便还有插件
为了省事,大家可以直接下载我下载好的资源点击下载
-
我们需要安装selenium库,因为webdriver在selenium里
保存二进制资源
注意:response是content形式
import requests
# 资源地址
url='https://m10.music.126.net/20201025120553/67c59f3b38316e2fdca3f8b39737024c/yyaac/obj/wonDkMOGw6XDiTHCmMOi/1918458169/baa9/638e/4385/bfc440b9ca05c987fc7d4178814325ef.m4a'
# 发起请求
response = requests.get(url).content
print(response)
# 数据写入文件
with open("漫步人生路.mp3",'wb') as fp:
fp.write(response)
使用Webdriver获取网页资源
from selenium import webdriver
from lxml import etree
browser = webdriver.Chrome()
url = "https://so.gushiwen.cn/search.aspx?value=%E6%9D%8E%E6%B8%85%E7%85%A7"
# 开始请求
browser.get(url)
#得到页面源代码
response=browser.page_source #字符串形式
print(response)
#关闭浏览器
browser.quit()
#关闭chreomedriver进程
browser.close()
Webdriver一些常用方法
在这里呢,我就不多写了,我提一下,大家知道可以这么做就好了,具体实现网上一大堆,要是实在找不到,那就准备好红包找我哦!
- webdriver的无头模式(不显示页面)
- 来截图
- 模拟滑动滚轮
- 模拟点击元素
- 输入账号密码
- 定位标签
唉,怕大家不会使用百度,给一个例子吧:
如何使用webdriver输入账号密码
使用键盘,将这段话填入到百度搜索框,按下回车,找相关介绍!!!
获取到的资源输出出来显示火星文(乱码)
这个其实没啥事,我们只需要在requests里面稍稍修改即可。
response = requests.get(url).content.decode()
实战教程推荐
这个是B站搜索的结果,使用python爬取音乐,可能有的已经过时了,大部分后面都是广告
反爬手段可能会升级,但思维能得到提升。
也可以加视频里的群,大部分群里每天都有小爬虫案例,白嫖挺舒服的,只要不被洗脑就好。。。
反爬的解决手段
信息没在第一个请求中
我们打开priview,使用Ctrl + F进行搜索,看看里面有没有你的资源,如果没有可能是在别的地方。
点一下我们的请求(将鼠标交点从Priview中移出),再按一下Ctrl + F,将我们想要的信息放进去
信息哪都没找到
直接上driver
开始状态200,后来404
可能是资源地址发生改变,或者是你的频率太快啦,ip被封啦。
使用sleep或者使用代理或者休息会再爬
验证码
看看能不能找到json数据,不能的话就直接上webdriver。
打开请求界面后,先sleep几秒钟,给你时间扫码或者输验证码、账号密码等。
其他
准备好红包,联系我!