怎么在DOS下用C语言写网络爬虫
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了怎么在DOS下用C语言写网络爬虫相关的知识,希望对你有一定的参考价值。
获取cspider_t。
自定义user agent,cookie,timeout,proxy以及抓取线程和解析线程的最大数量。
添加初始要抓取的url到任务队列。
编写解析函数和数据持久化函数。
启动爬虫。
例子
先来看下简单的爬虫例子,会在后面详细讲解例子。
#include<cspider/spider.h>/*
自定义的解析函数,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/5.0 (Macintosh; Intel Mac OS X 10.10; rv:42.0) Gecko/20100101 Firefox/42.0";
//char *cookie = "bid=s3/yuH5Jd/I; ll=108288; viewed=1130500_24708145_6433169_4843567_1767120_5318823_1899158_1271597; __utma=30149280.927537245.1446813674.1446983217.1449139583.4; __utmz=30149280.1449139583.4.4.utmcsr=accounts.douban.com|utmccn=(referral)|utmcmd=referral|utmcct=/login; ps=y; ue=965166527@qq.com; dbcl2=58742090:QgZ2PSLiDLQ; ck=T9Wn; push_noty_num=0; push_doumail_num=7; ap=1; __utmb=30149280.0.10.1449139583; __utmc=30149280";
//设置要抓取页面的url
cs_setopt_url(spider, "so.tv.sohu.com/list_p1100_p20_p3_u5185_u5730_p40_p5_p6_p77_p80_p9_2d1_p101_p11.html");
//设置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);
用python零基础写爬虫--编写第一个网络爬虫
首先要说明的是,一下代码是在python2.7版本下检测的
一.最简单的爬虫程序 --下载网页
import urllib2
request=urllib2.Request("http://www.baidu.com")
response = urllib2.urlopen(request)
print response.read()
怎么样,很简单吧。
urllib2是python中的一个标准库,以上代码会抓取一个特定的网页并将抓取的网页返回。urllib2这个库的使用要多加研究,这个是使用的基础。
1、urllib2是Python的一个获取URLs(Uniform Resource Locators)的组件。他以urlopen函数的形式提供了一个非常简单的接口,这是具有利用不同协议获取URLs的能力;它同样提供了一个比较复杂的接口来处理一般情况,例如:基础验证,cookies,代理和其他,它们通过handlers和openers的对象提供。
2、urllib2.urlopen(url, data=None, timeout=None)
参数
url:打开一个url,可以是字符串(如同urllib.urlopen的url参数),或是一个Request对象(这是special的地方)
data:向服务器传送的额外数据,仅http请求会用到这个参数。当data不为None时,说明此Http请求是Post,而不是Get。这个参数与urllib2.Request类的构造函数的data参数相同,详见urllib2.Request。一般不会设定这个参数,需要时会在urllib2.Request的构造函数处设置
timeout:设置超时的时间,类型是整型,单位是秒;如果超过指定时间仍未得到所请求服务器的响应(例如由于网络环境差等原因),则抛出异常,而不会无限制等待。适用于HTTP, HTTPS, FTP, FTPS
返回值
返回一个类似于文件描述符号(file-like)的对象,与urllib.urlopen的返回值相同,通过返回值也可以使用geturl()和info()。
3、urllib2.Request类,一般使用方法是使用其构造函数得到一个Request对象:class urllib2.Request(url[, data][, headers][, origin_req_host][, unverifiable])
表示一个URL请求
参数
url:一个URL字符串
data:向服务器传送的额外数据,仅http请求会用到这个参数。当data不为None时,说明此Http请求是Post,而不是Get。其类型应为字符串,一般使用urllib.urlencode()对一个dict或tuple进行处理,得到该字符串。
headers:请求头,类型是dict。除此之外,请求头可以在创建完Request对象后,通过该对象调用add_header(key, val)添加到对象中。常用方法是添加User-Agent请求头,冒充浏览器请求,用于哄篇服务器,因为一些服务器不允许程序访问。
后两个参数一般用不到,不再介绍
返回值
一个Request对象
4、urllib2.OpenerDirector类
当你获取一个URL时,你需要使用一个opener(OpenerDirector)。正常情况下我们一直使用默认的opener,被urlopen使用,但你也可以创建自定义的openers。opener使用handler处理任务,所有的重活都交给这些handlers来做。每一个handler知道怎么以特定的url协议打开url,或者怎么处理打开url的某些方面,如,HTTP重定向,或者HTTP cookie。
5、def urllib2.build_opener([handler, ...])
创建一个OpenerDirector对象,可以包含多个handlers
参数
handler, ...:urllib2提供很多handler来处理不同的请求,常用的HTTPHandler,FTPHandler都比较好理解。这里提一下HTTPCookieProcessor,HTTPCookieProcessor是处理cookie的,在很多需要身份验证的请求中cookie是必不可少的,python中对cookie的操作是由cookielib模块来完成的,而这个handler只是调用了其方法,在request和response过程中将cookie加到请求中和把cookie从响应中解析出来。
返回值
OpenerDirector对象
6、def urllib2.install_opener(opener)
install_opener能设置一个全局opener对象,这意味着调用urlopen将会都用你刚安装的opener。
参数
opener:OpenerDirector对象
7、urllib2.HTTPCookieProcessor类,通常使用其构造函数得到一个对象,即一个handler:class urllib2.HTTPCookieProcessor([cookiejar])
参数
cookiejar:一个cookielib.CookieJar对象,通过构造函数cookielib.CookieJar()得到
返回值
HTTPCookieProcessor对象,即一个handler
二.捕获下载异常
import urllib2
def download(url):
print ‘downloading:‘,url
try:
html=urllib2.urlopen(url).read()
except urllib2.URLError as e:
print ‘download error:‘, e.reason
html=None
return html
download(‘http://httpstat,us/500‘)
我们引入了urllib2标准库,并且定义了一个download函数 ,其中用到了 try/except 处理异常的语法。
三.网页出错与重试下载
import urllib2
def download(url,num_retries=2):
print ‘downloading:‘,url
try:
html=urllib2.urlopen(url).read()
except urllib2.URLError as e:
print ‘download error:‘, e.reason
html=None
if num_retries>0:
if hasattr(e, ‘code‘) and 500<=e.code<600:
#recursively retry 5XX http errors
return download(url, num_retries-1)
return html
下载时遇到的错误经常是临时性的,比如服务器过载时返回的503 Service Unavilable 错误等。
一般来说4xx错误发生在请求存在问题时候,5xx错误发生在服务器存在问题时。所以我们只需要确保在发生5xx错误时候重新下载。
1xx-信息提示
这些状态代码表示临时的响应。客户端在收到常规响应之前,应准备接收一个或多个1xx响应。
100-继续。
101-切换协议。
2xx-成功
这类状态代码表明服务器成功地接受了客户端请求。
200-确定。客户端请求已成功。
201-已创建。
202-已接受。
203-非权威性信息。
204-无内容。
205-重置内容。
206-部分内容。
3xx-重定向
客户端浏览器必须采取更多操作来实现请求。例如,浏览器可能不得不请求服务器上的不同的页面,或通过代理服务器重复该请求。
301-对象已永久移走,即永久重定向。
302-对象已临时移动。
304-未修改。
307-临时重定向。
4xx-客户端错误
发生错误,客户端似乎有问题。例如,客户端请求不存在的页面,客户端未提供有效的身份验证信息。400-错误的请求。
401-访问被拒绝。IIS定义了许多不同的401错误,它们指明更为具体的错误原因。这些具体的错误代码在浏览器中显示,但不在IIS日志中显示:
401.1-登录失败。
401.2-服务器配置导致登录失败。
401.3-由于ACL对资源的限制而未获得授权。
401.4-筛选器授权失败。
401.5-ISAPI/CGI应用程序授权失败。
401.7–访问被Web服务器上的URL授权策略拒绝。这个错误代码为IIS6.0所专用。
403-禁止访问:IIS定义了许多不同的403错误,它们指明更为具体的错误原因:
403.1-执行访问被禁止。
403.2-读访问被禁止。
403.3-写访问被禁止。
403.4-要求SSL。
403.5-要求SSL128。
403.6-IP地址被拒绝。
403.7-要求客户端证书。
403.8-站点访问被拒绝。
403.9-用户数过多。
403.10-配置无效。
403.11-密码更改。
403.12-拒绝访问映射表。
403.13-客户端证书被吊销。
403.14-拒绝目录列表。
403.15-超出客户端访问许可。
403.16-客户端证书不受信任或无效。
403.17-客户端证书已过期或尚未生效。
403.18-在当前的应用程序池中不能执行所请求的URL。这个错误代码为IIS6.0所专用。
403.19-不能为这个应用程序池中的客户端执行CGI。这个错误代码为IIS6.0所专用。
403.20-Passport登录失败。这个错误代码为IIS6.0所专用。
404-未找到。
404.0-(无)–没有找到文件或目录。
404.1-无法在所请求的端口上访问Web站点。
404.2-Web服务扩展锁定策略阻止本请求。
404.3-MIME映射策略阻止本请求。
405-用来访问本页面的HTTP谓词不被允许(方法不被允许)
406-客户端浏览器不接受所请求页面的MIME类型。
407-要求进行代理身份验证。
412-前提条件失败。
413–请求实体太大。
414-请求URI太长。
415–不支持的媒体类型。
416–所请求的范围无法满足。
417–执行失败。
423–锁定的错误。
5xx-服务器错误
服务器由于遇到错误而不能完成该请求。
500-内部服务器错误。
500.12-应用程序正忙于在Web服务器上重新启动。
500.13-Web服务器太忙。
500.15-不允许直接请求Global.asa。
500.16–UNC授权凭据不正确。这个错误代码为IIS6.0所专用。
500.18–URL授权存储不能打开。这个错误代码为IIS6.0所专用。
500.100-内部ASP错误。
501-页眉值指定了未实现的配置。
502-Web服务器用作网关或代理服务器时收到了无效响应。
502.1-CGI应用程序超时。
502.2-CGI应用程序出错。application.
503-服务不可用。这个错误代码为IIS6.0所专用。
504-网关超时。
505-HTTP版本不受支持。
以上是关于怎么在DOS下用C语言写网络爬虫的主要内容,如果未能解决你的问题,请参考以下文章