在简单完成了基金净值爬取以后,我们对中间的过程可能产生了很多疑惑,即使完成了目标,也仅仅是知其然而不知其所以然,而为了以后爬虫任务的顺利进行,对爬虫过程中所涉及的原理进行掌握是十分有必要的。 本文将会针对之前爬虫过程中所涉及到的几个爬虫原理进行简单的阐述。
url究竟是什么?它的构成有什么规律可循?URL和URI在访问任何一个网页时,我们都需要一个网页链接(如百度: www.baidu.com),这就相当于网页的“家庭地址”一样,只有在知道了这个“地址”,我们才能看到“这户人家”长得什么样。而这个“地址”在大部分时候也被称为URL,全称为Universal Resource Locator,即统一资源定位符。 除了URL,还有一个极少听到的名词——URI,全称为Uniform Resource Identifier,即统一资源标志符。 以获取基金代码列表时用到的链接为例—— http://fund.eastmoney.com/js/fundcode_search.js是天天基金网基金代码的数据存储链接,它是一个URL,也是一个URI。即有这样的数据资源,我们用URL/URl来唯一指定了它的访问方式,这其中包括了访问协议http、访问路径(/即根目录)和资源名称fundcode_search.js。通过这样的一个链接,我们便可以从互联网上找到这个资源,这就是URL/URI。 URL是URI的自己,也就是说每个URL都是URI,但不是每一个URI都是URL,URI的子集中还包括URN,它在目前的互联网中用得非常少,几乎所有的URI都是URL,因此,一般的网页链接我们都可以直接、也惯称为URL。 URL的解析在爬取基金代码和基金净值数据时,仔细观察相关的URL,我们可以发现它们的构成并非是无规律可循的。而事实上,URL的构成也确实存在一套统一的标准。 protocol://domain[:port]/path/[?parameters]#fragment
requests.get()中的headers和params参数又是什么?当我们尝试获取网页内容时,我们会用到requests.get()访问网站的服务器,然后获取想到得到的网页内容。 params参数requests.get()中的params参数就是为了将一些特别长,且明显有规律的URL,如: http://api.fund.eastmoney.com/f10/lsjz?callback=jQuery18303213780505917203_1548395296124&fundCode=000001&pageIndex=1&pageSize=20&startDate=&endDate=&_=1548395296139 以参数化的方式传入,让其URL组合更为简洁和格式化。 headers参数而我们在获取基金净值数据时发现,直接用URL访问并不能获得我们想要的内容,而是加上参数headers才成功。 这是因为对一些网页进行访问时,在你发送请求给服务器的过程中,需要使用一些附加信息,在获得服务器的识别和准许后,才能返回给你你所想要的内容。这就像我们平时到某个小区去看望朋友时,保安会在需要确认你的信息后才会放你同行一样。 常用头信息
是否只有get一种访问形式?每一次访问网页都是一次向服务器发出请求的过程。更具体的说,在浏览器中输入URL,回车之后会在浏览器观察到页面内容,这个过程就是浏览器向网站所在的服务器发送一个请求,网站服务器接收到这个请求后进行处理和解析,然后返回对应的响应,接着传回给浏览器。响应里包含了页面的源代码等内容,浏览器再对其进行解析,便将网页呈现出来,也就是最终我们在浏览器上所看到的效果。 请求由客户端(手机或PC浏览器)向服务器发出,可分为四部分:请求方法、请求的网址、请求头和请求体。而get则是一种请求方法。 请求方法常见的请求方法:GET和POST。 http://api.fund.eastmoney.com/f10/lsjz?callback=jQuery18303213780505917203_1548395296124&fundCode=000001&pageIndex=1&pageSize=20&startDate=&endDate=&_=1548395296139 其中URL中包含了请求的参数信息。
请求的网址即URL 请求头用来说明服务器要使用的附加信息,比如:Cookie、Referer、User-Agent等。 请求体一般承载的内容是POST请求中的表单数据,而对于GET请求,请求体则为空。 在爬虫中,如果要构造POST请求,需要使用正确的Content-Type,并了解各种请求库的各个参数设置时使用的是哪种Content-Type,不然可能会导致POST提交后无法正常响应
当我们尝试直接用循环去爬取所有内容的时候,是否会遭遇反爬?又该如何解决反爬?如果直接用循环去爬取网页内容时,经常,通常会由于被判别为爬虫而被禁止,也就是常说的反爬虫。 这种现象出现的原因往往是因为网址采取的反爬虫措施,比如,服务器会检测某个IP在单位时间内的请求次数,如果超过了这个阈值,就会直接拒绝服务,返回一些错误信息,统称这种情况被称为封IP。 遭遇反爬虫时,通常由两种思路: 1. 延长访问间隔时间:在每次循环访问时,用time.sleep方法,设置访问的间隔时间,但这种方法会降低爬虫的效率。 2. 代理IP:既然封IP是由于同一IP访问次数太多,那么我们如果借助代理IP的方式让服务器以为是不同的IP在访问服务器,就能有效的防止被封IP,但有效的代理IP通常也并不容易找到,需要付费购买。 因此,如果你的爬虫项目密度不大,可以采取第一种方式来语法反爬取,如果初始的爬虫量大,可以选择分批次爬取,整理后的代码如下:
View Code
上述代码虽然提供了基金净值数据爬虫的完整代码,但在具体项目的实施中,还需要根据项目的更新需求和更新周期来增加更新机制,这时,一个较为完整的爬虫小程序才算完成~
|
|