韭菜子

注册

 

发新话题 回复该主题

我的第一个Python爬虫谈心得 [复制链接]

1#
北京哪里治疗白癜风最有效 http://m.39.net/pf/bdfyy/bjzkbdfyy/

参加「CTA核心技术及应用峰会」,请扫码报名

↑↑↑

作者|跬步至以千里

来源|CSDN

原文地址


   

嗯,我们做爬虫不需要了解太多,只需要了解HTML是基于文档对象模型(DOM)的,以树的结构,存储各种标记,就像这样:

之后会用到这种思想来在一大堆HTML字符串中找出我们想要的东西。

了解了这个然后还得了解网页和服务器之间是怎么通信的,这就得稍微了解点HTTP协议,基于TCP/IP的应用层协议,规定了浏览器和服务器之间的通信规则,简单粗暴的介绍几点和爬虫相关的就是:

浏览器和服务器之间有如下几种通信方式:

GET:向服务器请求资源,请求以明文的方式传输,一般就在URL上能看到请求的参数

POST:从网页上提交表单,以报文的形式传输,请求资源


   

还有几种比较少见就不介绍了。

了解了这两点就可以准备工具了,当然,对爬虫有兴趣还可以了解一下爬虫的发展史。

二、介绍几款优秀制作爬虫的辅助工具

由于我是采用python3.6开发的,然后从上文的介绍中,也该知道了一只爬虫是需要从HTML中提取内容,以及需要和网页做交互等。


   

如果不采用爬虫框架的话,我建议采用/p>


  
  

BeautifulSoup库,一款优秀的HTML/XML解析库,采用来做爬虫,不用考虑编码,还有中日韩文的文档,其社区活跃度之高,可见一斑。([注]这个在解析的时候需要一个解析器,在文档中可以看到,推荐lxml)

BeautifulSoup库


  
   

Requests库,一款比较好用的HTTP库,当然python自带有urllib以及urllib2等库,但用起来是绝对没有这款舒服的。

Requests库


   

乍一看,就这么个玩意儿,这些电影名还不如直接自己去网页看,这有什么用呢?但是,你想想,只要你掌握了这种方法,如果有翻页你可以按照规则爬完了一页就解析另外一页HTML(通常翻页的时候URL会规律变化,也就是GET请求实现的翻页),也就是说,只要掌握的爬取方法,无论工作量有多么大都可以按你的心思去收集想要的数据了。

四、需要模拟登录后再爬取的爬虫所需要的信息

4.1.登录分析

刚才的爬虫未免太简单,一般也不会涉及到反爬虫方面,这一次分析需要登录的页面信息的爬取,按照往例,首先打开一个网页:

我选择了我学校信息服务的网站,登录地方的代码如下:


   

可以看到验证码都没有,就只有账号密码以及提交。光靠猜的当然是不行的,一般输入密码的地方都是POST请求。

POST请求的响应流程就是客户在网页上填上服务器准备好的表单并且提交,然后服务器处理表单作出回应。一般就是用户填写帐号、密码、验证码然后把这份表单提交给服务器,服务器从数据库进行验证,然后作出不同的反应。在这份POST表单中可能还有一些不需要用户填写的用脚本生成的隐藏属性作为反爬虫的手段。

要知道表单格式可以先试着随便登录一次,然后在F12中的netword中查看登录结果,如图:

图1

 
   
   
   
   

图2

如果用真正的账号密码登录,要记住勾选上面的Preservelog,这样即使网页发生了跳转之前的信息也还在。

从上面的两张图中很容易发现其中的一个POST请求,login?serv…就是登录请求了。

可以看到这个登录请求所携带的信息有/p>

General:记录了请求方式,请求地址,以及服务器返回的状态号等

ResponseHeaders:响应头,HTTP响应后传输的头部消息

RequestHeaders:请求头,重点!!,向服务器发送请求时,发出的头部消息,之中很多参数都是爬虫需要模拟出来传送给服务器的。

FromData:表单,重点!!,在这里表单中有/p>

username:password:MTIzNDU=lt:e1s1_eventId:submit

我明明都填的,为什么密码变了呢?可以看出这密码不是原始值,应该是编码后的产物,网站常用的几种编码/加密方法就几种,这里是采用的base64编码,如果对密码编码的方式没有头绪可以仔细看看登录前后页面的前端脚本。运气好可以看到encode函数什么的。

4.2信息提取

如果了解过Resquests库的文档或POST通信原理就知道,发送一个一般的POST请求所需要的参数:

r=requests.post(url,[data],[header],[json],[**kwargs])/*url--URLforthenewRequestobject.data--(optional)Dictionary,bytes,orfile-likeobjecttosendinthebodyoftheRequest.json--(optional)jsontosendinthebodyoftheRequest.**kwargs--Optionalargumentsthatrequesttakes.*/

从上面的两张图片中即可找到发送一个正确的请求所需要的参数,即url和data:

url即上面的RequestURL/p>

RequestURL/p>


  

在这里,服务器端一般是采用的Cookie技术,登陆后给你一个Cookie,以后你发出跳转网页的请求就携带该Cookie,服务器就能知道是你在哪以什么状态点击的该页面,也就解决了HTTP传输的无状态问题。


  

很明显,在模拟登录以后保持登录状态需要用得着这个Cookie,当然Cookie在请求头中是可见的,为了自己的账号安全,请不要轻易暴露/泄漏自己的Cookie

二、先了解一下,用python程序访问网页的请求头的User-Agent是什么样的呢?没错,如下图所示,很容易分辨这是程序的访问,也就是服务器知道这个请求是爬虫访问的结果,如果服务器做了反爬虫措施程序就会访问失败,所以需要模仿浏览器头。

三、查找表单隐藏参数的获取方式,在上文表单列表中有个lt参数,虽然我也不知道他是干嘛的,但通过POST传输过去的表单肯定是会经过服务器验证的,所以需要弄到这份参数,而这份参数一般都会在HTML页面中由JS脚本自动生成,可以由Beautifulsoup自动解析抓取。
  


  

关于Fiddler的使用和请求信息相关信息可以查看链接:
  

抓包请求—模仿请求头和表单—如果请求失败,则仔细对比正常访问和程序访问的数据包—成功则根据内容结构进行解析—清清洗数据并展示

(本文为AI科技大本营整理文章,转载请

分享 转发
TOP
发新话题 回复该主题