为什么爬虫程序抓取同一个页面的HTML和实际显示的HTML不同

为什么爬虫程序抓取同一个页面的HTML和实际显示的HTML不同,第1张

一定要设置User-Agent

urlConnectionsetRequestProperty("User-Agent","Mozilla/40 (compatible; MSIE 60; Windows 2000)");

上周从零学习了golang,语法简单关键字少,写个爬虫熟悉一下语法结构。

首先选用了原生的net/>

前言

大家在平时或多或少地都会有编写网络爬虫的需求。一般来说,编写爬虫的首选自然非python莫属,除此之外,java等语言也是不错的选择。选择上述语言的原因不仅仅在于它们均有非常不错的网络请求库和字符串处理库,还在于基于上述语言的爬虫框架非常之多和完善。良好的爬虫框架可以确保爬虫程序的稳定性,以及编写程序的便捷性。所以,这个cspider爬虫库的使命在于,我们能够使用c语言,依然能够优雅地编写爬虫程序。

爬虫的特性

配置方便。使用一句设置函数,即可定义user agent,cookie,timeout,proxy以及抓取线程和解析线程的最大数量。

程序逻辑独立。用户可以分别定义爬虫的解析函数,和数据持久化函数。并且对于解析到的新url,用户可以使用cspider提供的addUrl函数,将其加入到任务队列中。

便捷的字符串处理。cspider中提供了基于pcre的简单的正则表达式函数,基于libxml2的xpath解析函数,以及用于解析json的cJSON库。

高效的抓取。cspider基于libuv调度抓取线程和解析线程,使用curl作为其网络请求库。

使用cspider的步骤

获取cspider_t。

自定义user agent,cookie,timeout,proxy以及抓取线程和解析线程的最大数量。

添加初始要抓取的url到任务队列。

编写解析函数和数据持久化函数。

启动爬虫。

例子

先来看下简单的爬虫例子,会在后面详细讲解例子。

#include<cspider/spiderh>

/

自定义的解析函数,d为获取到的html页面字符串

/

void p(cspider_t cspider, char d, void user_data) {

char get[100];

//xpath解析html

int size = xpath(d, "//body/div[@class='wrap']/div[@class='sort-column area']/div[@class='column-bd cfix']/ul[@class='st-list cfix']/li/strong/a", get, 100);

int i;

for (i = 0; i < size; i++) {

//将获取到的**名称,持久化

saveString(cspider, get[i]);

}

}

/

数据持久化函数,对上面解析函数中调用的saveString()函数传入的数据,进行进一步的保存

/

void s(void str, void user_data) {

char get = (char )str;

FILE file = (FILE)user_data;

fprintf(file, "%s\n", get);

return;

}

int main() {

//初始化spider

cspider_t spider = init_cspider();

char agent = "Mozilla/50 (Macintosh; Intel Mac OS X 1010; rv:420) Gecko/20100101 Firefox/420";

//char cookie = "bid=s3/yuH5Jd/I; ll=108288; viewed=1130500_24708145_6433169_4843567_1767120_5318823_1899158_1271597; __utma=301492809275372451446813674144698321714491395834; __utmz=30149280144913958344utmcsr=accountsdoubancom|utmccn=(referral)|utmcmd=referral|utmcct=/login; ps=y; ue=965166527@qqcom; dbcl2=58742090:QgZ2PSLiDLQ; ck=T9Wn; push_noty_num=0; push_doumail_num=7; ap=1; __utmb=301492800101449139583; __utmc=30149280";

//设置要抓取页面的url

cs_setopt_url(spider, "sotvsohucom/list_p1100_p20_p3_u5185_u5730_p40_p5_p6_p77_p80_p9_2d1_p101_p11html");

//设置user agent

cs_setopt_useragent(spider, agent);

//cs_setopt_cookie(spider, cookie);

//传入解析函数和数据持久化函数的指针

cs_setopt_process(spider, p, NULL);

//s函数的user_data指针指向stdout

cs_setopt_save(spider, s, stdout);

//设置线程数量

cs_setopt_threadnum(spider, DOWNLOAD, 2);

cs_setopt_threadnum(spider, SAVE, 2);

//FILE fp = fopen("log", "wb+");

//cs_setopt_logfile(spider, fp);

//开始爬虫

return cs_run(spider);

}

例子讲解

cspider_t spider = init_cspider();获取初始的cspider。cs_setopt_xxx这类函数可以用来进行初始化设置。其中要注意的是: cs_setopt_process(spider,p,NULL);与cs_setopt_save(spider,s,stdout);,它们分别设置了解析函数p和数据持久化函数s,这两个函数需要用户自己实现,还有用户自定义的指向上下文信息user_data的指针。

在解析函数中,用户要定义解析的规则,并对解析得到的字符串可以调用saveString进行持久化,或者是调用addUrl将url加入到任务队列中。在saveString中传入的字符串会在用户自定义的数据持久函数中得到处理。此时,用户可以选择输出到文件或数据库等。

最后调用cs_run(spider)即可启动爬虫。

具体的API参数可在这里查看

总结

赶快使用cspider爬虫框架来编写爬虫吧!如果在使用过程中发现bug,欢迎反馈。

望采纳,谢谢

主流爬虫框架通常由以下部分组成:

1种子URL库:URL用于定位互联网中的各类资源,如最常见的网页链接,还有常见的文件资源、流媒体资源等。种子URL库作为网络爬虫的入口,标识出爬虫应该从何处开始运行,指明了数据来源。

2数据下载器:针对不同的数据种类,需要不同的下载方式。主流爬虫框架通畅提供多种数据下载器,用来下载不同的资源,如静态网页下载器、动态网页下载器、FTP下载器等。

3过滤器:对于已经爬取的URL,智能的爬虫需要对其进行过滤,以提高爬虫的整体效率。常用的过滤器有基于集合的过滤器、基于布隆过滤的过滤器等。

4流程调度器:合理的调度爬取流程,也可以提高爬虫的整体效率。在流程调度器中,通常提供深度优先爬取、广度优先爬取、订制爬取等爬取策略。同时提供单线程、多线程等多种爬取方式。

以上就是关于为什么爬虫程序抓取同一个页面的HTML和实际显示的HTML不同全部的内容,包括:为什么爬虫程序抓取同一个页面的HTML和实际显示的HTML不同、Golang net/http 爬虫[1]、如何优雅地使用c语言编写爬虫等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/10134838.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-05
下一篇2023-05-05

发表评论

登录后才能评论

评论列表(0条)

    保存