scrapy分页抓取网页(一下抓取别人网站数据的方式有什么作用?如何抓取)
优采云 发布时间: 2022-01-03 07:02scrapy分页抓取网页(一下抓取别人网站数据的方式有什么作用?如何抓取)
我相信所有 网站 网站站长都有捕获他人数据的经验。目前抓取别人的网站数据有两种方式:
一、使用第三方工具,其中最著名的是优采云采集器,这里不再介绍。
二、自己写程序抓包,这种方法需要站长自己写程序,可能需要站长的开发能力。
一开始,我尝试使用第三方工具来抓取我需要的数据。因为网上流行的第三方工具要么不符合我的要求,要么太复杂,一时没弄明白怎么用,后来干脆决定自己写。现在半天就能搞定一个网站(只是程序开发的时间,不包括抓数据的时间)
经过一段时间的数据爬取生涯,遇到了很多困难。最常见的问题之一是抓取分页数据。原因是数据分页的形式很多。下面我将主要从三个方面介绍表单中抓取分页数据的方法。虽然我在网上看到过很多这样的文章,但是每次拿别人的代码时总会出现各种各样的问题。以下代码都是可以正确执行的,我目前正在使用中。本文的代码实现是用C#语言实现的,我觉得其他语言的原理大致相同。
以下切入正题:
第一种方法:URL地址收录分页信息。这种形式是最简单的。这个表单也很简单,使用第三方工具爬取。基本上,您不需要编写代码。对我来说,我宁愿自己花半天时间写代码又懒得学第三方工具的可以自己写代码;
该方法是通过循环生成数据页面的URL地址,如: 这样通过HttpWebRequest访问对应的URL地址,返回对应页面的html文本。接下来的任务是解析字符串并将需要的内容保存到本地的数据库中;爬取代码可以参考如下:
公共字符串 GetResponseString(string url){
string _StrResponse = "";
HttpWebRequest _WebRequest = (HttpWebRequest)WebRequest.Create(url);
_WebRequest.UserAgent = "MOZILLA/4.0 (COMPATIBLE; MSIE 7.0; WINDOWS NT 5.2; .NET CLR 1.1.4322 ; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5. 21022;.NET CLR 3.0.4506.2152;.NET CLR 3.5.30729)";
_WebRequest.Method = "GET";
WebResponse _WebResponse = _WebRequest.GetResponse();
StreamReader _ResponseStream = new StreamReader(_WebResponse.GetResponseStream(), System.Text.Encoding.GetEncoding("gb2312"));
_StrResponse = _ResponseStream.ReadToEnd();
_WebResponse.Close();
_ResponseStream.Close();
返回_StrResponse;
}
上面的代码可以返回页面html内容对应的字符串,剩下的工作就是从这个字符串中获取你关心的信息。
方法二:在网站的开发过程中可能会经常遇到。它的分页控件通过post的方式向后台代码提交分页信息,比如.net下Gridview自带的分页功能,当你点击分页页码的时候,会发现URL地址没有变,但是页码变了,页面内容也变了。仔细看会发现状态栏会显示javascript:__dopostback("gridview","当你将鼠标移到每个页码上时的代码如page1")等,这种形式其实也不是很难,因为毕竟有一个地方可以找到获取页码的规则。
我们知道提交HTTP请求有两种方式。一个是get,一个是post,第一个是get,第二个是post。具体的投稿原则无需赘述,不在本文中。专注
获取这种页面需要注意页面的几个重要元素
一、 __VIEWSTATE,这应该是 .net 独有的,也是 .net 开发人员又爱又恨的东西。当你打开一个网站的页面时,如果你发现这个东西后面跟着很多乱七八糟的字符,那么这个网站一定要写;
二、__dopostback方法,这是一个自动生成页面的javascript方法,收录两个参数,__EVENTTARGET,__EVENTARGUMENT,这两个参数可以参考页码对应的内容,因为当你点击翻页的时候页面,将改变页码的信息传递给这两个参数。
三、__EVENTVALIDATION 这也应该是唯一的
不要太担心这三件事的作用。自己写代码抓取页面的时候记得提交这三个元素。
和第一种方法一样,必须循环把_dopostback的两个参数拼凑起来。您只需要拼凑收录页码信息的参数即可。这里需要注意的一点是,每次通过Post提交下一页的请求时,首先要获取当前页面的__VIEWSTATE信息和__EVENTVALIDATION信息,这样就可以通过第一种方式获取到分页数据的第一页页码内容 然后,同时取出对应的__VIEWSTATE信息和__EVENTVALIDATION信息,然后做一个循环处理下一页,然后每次爬到一个页面,记录__VIEWSTATE信息和__EVENTVALIDATION信息,提交给下一页发布数据使用
参考代码如下:
<p>for (int i = 0; i