(1)个人使用小爬虫---------关于一次被论坛封号而搜索的思考

news/2024/7/19 10:53:34 标签: 爬虫, php, xhtml

    前段时间上了某论坛的技术讨论区,习惯性的打开搜索看有没有我需要的内容,一登陆账号,发现自己被禁言了,连基本的搜索功能也被限制了。无奈只能手动的一个一个会找帖子。我去,竟然有200多页,每页有40第数据,这样纯手工的方式实在是太蛋疼了。

    前段时间自己不是写了一个小爬虫吗?于是我的个人论坛搜索器开始构建了。

    一,整体构建

二,实际编码

1,数据读取编码:

读取网页有很多种方法,第一读取网页我选择的是最简单的方式 

static string GetPage(int page)
{
  string reuslt = string.Empty;
  System.Net.WebClient wb = new System.Net.WebClient();
  reuslt = wb.DownloadString("http://xx.xxx.xx/thread0806.php?fid=7&search=&page=" + page);
  return reuslt;
}

直接利用webclient 读取内容:

咦,这是怎么回事?

直接访问是不可以的,哪里出错了呢?

难不成是地址出错了?我重新检查了一次没有拼错,那换成其它地址呢?

测试可以使用,那就是说这种请求方式只对百度有效。

那说明:直接使用webClinent类来请求xx.xxx.xx这种网站是不可行的,因为它会来接收你的请求头的信息来判断是人工发出的请求还是非人工发出的请求。

如何构造请求头是关键!

那换用另一种方式来请求来,如果要构建新的请求方式,那首先要明白,一次“人工的请求方式”应该是怎么样的,打开chrome,监视了一次请求,得到结果如下:

一次合理的请求方式包含哪些信息呢?

url:请求地址

Method:请求方式

Headers:

Accept:本次请求得到的回应的数据格式,版本

Accept-Charset:我这次请求可以接受的编码格式 GBK,UTF-8;q=0.7

Accept-Encoding:编码格式(gzip格式)

Accept-Language:中文

Cache-Control:缓存设置

User-Agent:请求标识头部分

OK,这些既然得到了,那可以开始构建一次正常的请求了。

  static string Getpage(int page)
        {
            System.IO.Stream response;
            System.IO.StreamReader sr;
            string result = string.Empty;
            string domain = "http://xx.xxx.xx/thread0806.php?fid=7&search=&page=" + page;
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(domain);
            request.Method = "GET";
            request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
            request.Headers.Set("Accept-Charset", "GBK,utf-8;q=0.7,*;q=0.3");          
            request.Headers.Set("Accept-Language", "zh-cn,zh;q=0.5");
            request.Headers.Set("Accept-Encoding", "gzip,deflate,sdch");
            request.Host = "xx.xxx.xx";           
            request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.47 Safari/536.11";           
            request.KeepAlive = true;
            HttpWebResponse httprp = (HttpWebResponse)request.GetResponse();
            httprp.Headers.Set("Content-Encoding", "gzip");
            response = httprp.GetResponseStream();
            sr = new System.IO.StreamReader(response,Encoding.UTF8);         
            result = sr.ReadToEnd();
            response.Close();
            sr.Close();
            return result;
        }

OK,那测试一下看得到数据没有.

怎么都是乱码呢?

设置读取的时候都是正常的UTF-8编码,如果读取的编码没有问题,那问题应该出在传送的编码上面。我竟然忽略了返回的格式了

  httprp.Headers.Set("Content-Encoding", "gzip");

很明显,文档经过了Gzip格式进行压缩,然后在传送过来了,那需要解码一次:代码如下

     static string Getpage(int page)
        {
            System.IO.Stream response;
            System.IO.StreamReader sr;
            string result = string.Empty;
            string domain = "http://xx.xxx.xx/thread0806.php?fid=7&search=&page=" + page;
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(domain);
            request.Method = "GET";
            request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
            request.Headers.Set("Accept-Charset", "GBK,utf-8;q=0.7,*;q=0.3");          
            request.Headers.Set("Accept-Language", "zh-cn,zh;q=0.5");
            request.Headers.Set("Accept-Encoding", "gzip,deflate,sdch");
            request.Host = "xx.xxx.xx";           
            request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.47 Safari/536.11";           
            request.KeepAlive = true;
            HttpWebResponse httprp = (HttpWebResponse)request.GetResponse();
            httprp.Headers.Set("Content-Encoding", "gzip");
            response = httprp.GetResponseStream();
//重新修改后的代码 sr = new System.IO.StreamReader(new GZipStream(response, CompressionMode.Decompress), Encoding.GetEncoding("gb2312")); result = sr.ReadToEnd(); response.Close(); sr.Close(); return result; }

那得到结果没有呢?

 

OK,正常得到结果!那下面的工作就简单了~

PS:晚上继续更新第二部分,(数据展示内容---正则表达式的应用)

转载于:https://www.cnblogs.com/codefish/archive/2012/11/17/2774911.html


http://www.niftyadmin.cn/n/550930.html

相关文章

慢查询日志

慢查询日志 slow_query_log 启动/停止记录慢查询日志,默认是OFF slow_query_log_file 指定慢查询日志的存储路径,默认存放路径与data存放路径一致 long_query_time 指定记录慢查询日子SQL执行时间的阈值,默认是10s,通常改为1ms…

[职场晋升术 傻坚持好过不坚持]读书笔记

坚持下来就是资本转机孕育在坚持路上,坚持到底才能有收获成功就是不断地重复 转载于:https://www.cnblogs.com/bluescorpio/archive/2012/11/21/2780257.html

[Netty学习笔记]一、I/O模型

I/O模型 I/O模型简单的理解:就是用什么样的通道进行数据的发送和接收,很大程度上决定了程序通信的性能。 Java共支持是三种网络编程模型:BIO/NIO/AIO BIO模型 Java BIO:同步阻塞(传统阻塞型),服务器实现模式是一个连接一个线程…

来!一起给 Visual Studio 2012 找找茬

您在使用 VS2012 的过程中,有什么不爽的地方,分享出来让大家“爽”一下,同时也可以减轻自己的不爽。我来起个头。 1. 添加新类时不自动加上 public 关键字 这个问题在 VS2010 中就已经存在,在开发中多数时候都需要在 class 前面加…

[Netty学习笔记]二、NIO核心组件Buffer

通过上一节我们了解NIO的三大核心组件分别是Buffer、Channel、Selector。 三大核心部分的关联图: 每个channel都会对应一个BufferSelector对应一个线程,一个线程对应多个channel上图显示有三个channel注册到selector上Selector是由事件驱动的,程序切换到…

java 理解实例和类成员(翻译自Java Tutorials)

原文出自 http://www.cnblogs.com/ggjucheng/archive/2012/11/30/2796085.html 这个章节,我们主要介绍static关键字创建类的字段和实例,而不是讲类的实例。 类变量 从类的蓝图中创建一个对象,每个对象都有自己的变量的唯一拷贝。例如Bicycle类…

python 集合类型 tuple 与 list

Tuple 是不可变 list。 一旦创建了一个 tuple 就不能以任何方式改变它。Tuple 与 list 的相同之处定义 tuple 与定义 list 的方式相同, 除了整个元素集是用小括号包围的而不是方括号。Tuple 的元素与 list 一样按定义的次序进行排序。 Tuples 的索引与 list 一样从 0 开始, 所以…

[Netty学习笔记]三、NIO核心组件Channel

通道(Channel) NIO的通道类似于流,但有些区别如下: 通道可以同时进行读写,而流只能读或者只能写通道可以实现异步读写数据通道可以从缓冲区读数据,也可以写数据到缓冲区 Channel在NIO中是一个接口,常用的Channel类有:FileChann…