共计 2515 个字符,预计需要花费 7 分钟才能阅读完成。
很多同学私信问爬虫的相干教程,想了想,还是专门跟大家出些 Python 爬虫学习相干的教程,从零开始论述如何编写 Python 网络爬虫,以及网络爬虫中容易遇到的问题,比方具备反爬加密的网站,还有爬虫拿不到数据,以及登录验证等问题,会随同大量网站的爬虫实战来进行。
咱们编写网络爬虫最次要的目标是爬取想要的数据还有通过爬虫去主动实现咱们想在网站中做的一些事件。
这里我会从根底开始解说如何通过网络爬虫去实现你想要做的事。
先来看一段简略的代码。
import requests #导入 requests 包
url = ‘https://www.cnblogs.com/LexMoon/’
strhtml = requests.get(url) #get 形式获取网页数据
print(strhtml.text)
首先是 import requests 来导入网络申请相干的包,而后定义一个字符串 url 也就是指标网页,之后咱们就要用导入的 requests 包来申请这个网页的内容。
这里用了 requests.get(url),这个 get 并不是拿取的那个 get,而是一种对于网络申请的办法。
网络申请的办法有很多,最常见的有 get,post,其它如 put,delete 你简直不会见到。
requests.get(url) 就是向 url 这个网页发送 get 申请 (request),而后会返回一个后果,也就是这次申请的响应信息。
响应信息中分为响应头和响应内容。
响应头就是你这次拜访是不是胜利了,返回给你的是什么类型的数据,还有很多一些。
响应内容中就是你取得的网页源码了。
好了,这样你就算是入门 Python 爬虫了,然而还是有很多问题。
- get 和 post 申请有什么区别?
- 为什么有些网页我爬取到了,外面却没有我想要的数据?
- 为什么有些网站我爬下来的内容和我实在看到的网站内容不一样?
get 和 post 申请有什么区别?
get 和 post 的区别次要在于参数的地位,比如说有一个须要登录用户的网站,当咱们点击登录之后,账号密码应该放在哪里。
get 申请最直观的体现就是申请的参数就放在了 URL 中。
比如说你百度 Python 这个关键字,就能够发现它的 URL 如下:
https://www.baidu.com/s?wd=Python&rsv_spt=1
这外面的 dw=Python 就是参数之一了,get 申请的参数用? 开始,用 & 分隔。
如果咱们须要输出明码的网站用了 get 申请,咱们的个人信息不是很容易裸露吗,所以就须要 post 申请了。
在 post 申请中,参数会放在申请体内。
比如说上面是我登录 W3C 网站时的申请,能够看到 Request Method 是 post 形式。
在申请的上面还有咱们发送的登录信息,外面就是加密过后的账号密码,发送给对方服务器来测验的。
为什么有些网页我爬取到了,外面却没有我想要的数据?
咱们的爬虫有时候可能爬下来一个网站,在查看外面数据的时候会发现,爬下来的是指标网页,然而外面咱们想要的数据却没有。
这个问题大多数产生在指标数据是那些列表型的网页,比如说前几天班上一个同学问了我一个问题,他在爬携程的航班信息时,爬下来的网页除了取得不了航班的信息,其余中央都能够拿到。
网页地址:https://flights.ctrip.com/itinerary/oneway/cgq-bjs?date=2019-…
如下图:
这是一个很常见的问题,因为他 requests.get 的时候,是去 get 的下面我放的那个 URL 地址,然而这个网页尽管是这个地址,然而他外面的数据却不是这个地址。
听起来很像很难,然而从携程这个网站的设计人的角度来说,加载的这部分航班列表信息可能很宏大,如果你是间接放在这个网页外面,咱们用户关上这个网页可能须要很久,以至于认为网页挂了而后敞开,所以设计者在这个 URL 申请中只放了主体框架,让用户很快进入网页中,而次要的航班数据则是之后再加载,这样用户就不会因为期待很长时间而退出了。
说到底怎么做是为了用户体验,那么咱们应该怎么解决这个问题呢?
如果你学过前端,你应该晓得 Ajax 异步申请,不晓得也没事,毕竟咱们这里不是在说前端技术。
咱们只须要晓得咱们最开始申请的 https://flights.ctrip.com/itinerary/oneway/cgq-bjs?date=2019-… 这个网页中有一段 js 脚本,在这个网页申请到之后会去执行,而这段脚本的目标就是去申请咱们要爬的航班信息。
这时候咱们能够关上浏览器的控制台,举荐应用谷歌或者火狐浏览器,按 F 进入坦克,不,按 F12 进入浏览器控制台,而后点击 NetWork。
在这里咱们就能够看到这个网页中产生的所有网络申请和响应了。
在这外面咱们能够找到申请航班信息的其实是 https://flights.ctrip.com/itinerary/api/12808/products 这个 URL。
为什么有些网站我爬下来的内容和我实在看到的网站内容不一样?
最初一个问题就是为什么有些网站我爬下来的内容和我实在看到的网站内容不一样?
这个的次要起因是,你的爬虫没有登录。
就像咱们平时浏览网页,有些信息须要登录能力拜访,爬虫也是如此。
这就波及到了一个很重要的概念,咱们的平时观看网页是基于 Http 申请的,而 Http 是一种无状态的申请。
什么是无状态?你能够了解为它不认人,也就是说你的申请到了对方服务器那里,对方服务器是不晓得你到底是谁。
既然如此,咱们登录之后为什么还能够长时间持续拜访这个网页呢?
这是因为 Http 尽管是无状态的,然而对方服务器却给咱们安顿了身份证,也就是 cookie。
在咱们第一次进入这个网页时,如果之前没有拜访过,服务器就会给咱们一个 cookie,之后咱们在这个网页上的任何申请操作,都要把 cookie 放进去。这样服务器就能够依据 cookie 来辨识咱们是谁了。
比方知乎外面就能够找到相干的 cookie。
对于这类网站,咱们间接从浏览器中拿到已有的 cookie 放进代码中应用,requests.get(url,cookies=”aidnwinfawinf”),也能够让爬虫去模仿登录这个网站来拿到 cookie。
更多的 Python 爬虫学习教程也会持续为大家更新!