爬虫的那些事

近期在做一个简单的爬虫项目,做的比较的简单,目前基本上实现爬虫的基本功能,以下是对这些天做的东西以及遇到问题的一些总结:

首先简单说下做一个简单的爬虫需要掌握的基本技能:

1.对http协议要有基本的了解,学会用Chrom/Firfox的F12(开发者工具)

2.对网页(前端的东西:HTML/CSS)、DOM有一定的掌握

3.学会用httpClient 、Jsoup这些有用的架包

4.学会利用网上的各种资源(博客、API文档等)

爬虫简单的来说就是模拟浏览器发送请求(request),得到(response)我们想要数据的页面(HTML页面)后解析页面得到我们想要的数据,在浏览器输入网址或者点击相应的按钮即可跳转到我们想要的页面,看起来非常的简单,实际上浏览器在背后给我们做了很多的东西:数据是请求方式该是get还是post,能支持哪些形式的返回结果、请求头要添加哪些cookie、请求的参数有哪些……,如果要写爬虫的话,这些东西都是需要我们自己在代码中去设置的,这里就引出了F12的重要性。

浏览器的开发者工具(F12)给我们提供了极大的便利,打开F12的network,我们就能清楚的知道当发起一个请求的时候浏览器发送的请求头了发送了哪些东西,添加了哪些参数,response了什么东西等等,所以,在我们做爬取的时候,首先得知道我们要爬取的数据的URL,爬虫做的简单点的可能就爬取一个网页(HTML),这种情况可能我们知道一个URL地址就足够了,如果稍微做的复杂一点,我们会发现,一个URL地址是不行的,比如有些网站,必须登录才能访问,再比如要爬取知网上2017年这一年的所有期刊的课题的一些信息,在浏览器上的操作,我们需要先在浏览器上cnki.net进入知网,在点击知网上的高级搜索跳转到搜索界面,再点击期刊选搜索条件(2017年)再点击搜索按钮得到我们需要的数据,这个时候复制浏览器上最后一个页面的URL地址,在另一个浏览器上访问,按理说应该是能得到我们想要的结果的,可实际上,并不能访问,具体的原因到后面再说。

以上说的F12给我们带来了极大的便利,可以让我们很容易的知道请求头和响应头的所有东西,可是如果你连这些东西都不知道干什么的,那再便利也没用。要知道这些东西就要了解一下HTTP协议了,要基本了解HTTP协议中的请求头里有什么东西,响应头里有什么东西,各自有什么作用,GET请求和POST请求的区别等等,然后在程序中我们才能更好的模拟发送请求并分析响应结果。

在代码中模拟浏览器发送请求我是用了apache公司的httpcliet4.5,httpclient非常强大,能轻松发送get/post请求,为请求添加头部信息、添加cookie,得到响应等,具体的用法网上都有就不细说了。

之所以需要了解HTML/CSS,是因为我们需要的数据在HTML中,response返回的大都情况下是一个HTML,我们需要对HTML进行解析,最终得到我们想要的数据。这就要求我们队HTML结构有基本的了解,如果哪些是属性,class都不知道,那我们无从解析。前面我提到的Jsoup就是用来解析HTML的,很多的时候我们都是通过元素的属性或者class来找到我们的数据的,所以要多这些东西有一定的了解。

下面总结下这些天做爬虫遇到的问题,因为第一次做爬虫,所以问题可能都是比较菜鸟级别的:

1.URL无法访问

前面提到过这个问题,就是我们需要的数据可能在一个网站上需要多次重定向,在浏览器上复制最终有我们数据页面的URL在另一个浏览器上打不开,在本浏览器上开始能直接打开,过一段时间后也打不开,什么道理???

后来经过F12对network进行分析发现,当用户点击一个按钮或者文字链接的时候,不仅仅是发起一个request 然后放回一个response这么简单,而是多个request,多个response.比如知网,我们要查询知网2017年所有期刊,我们选择条件后点击查询按钮,发现浏览器首相发送一个get请求response了一个字符串并返回了一些cookie值,而我们需要的结果(期刊列表)是浏览器发起的另外一个请求结果,而这个请求的的头里面添加了上一个请求的返回得到的cookie值,如果在请求头里没有添加这些cookie,就得不到我们想要的结果,所以在程序中我们需要模拟发送这样的两个请求才能得到我要想要的数据,第一次请求主要是得到必要的cookie,第二个发送带cookie的请求,也就解决了不能访问的问题(因为没有必要的cookie发送给服务器,服务器认为这次请求是不合理的)

2.请求后返回的页面之后20条(一页)数据,如何得到全部的数据,下一页的数据如何得到?

进过分析发现,上一页和下一页的URL地址只有微妙的变化,URL后面有一个参数就是控制当前页的,所以当我们需要得到下一页的数据的时候只要将这个参数+1即可,在程序中这个参数通过一个变量来控制,通过一个while循环来不断发起请求,变量值+1,没有数据的时候break就行

你可能感兴趣的:(爬虫的那些事)