电话+V:192606-48052 ,欢迎咨询c语言爬虫代码案例,[python实用课程],[C++单片机原理],[C#、PHP网站搭建],[Nodejs小程序开发],[ios游戏开发],[安卓游戏开发],[教会用大脑用想法赚钱实现阶层跨越]
在C语言编程中,构建了一个利用cURL库进行内容抓取的简单爬虫程序,目标是从小红书平台xiaohongshu.com获取信息。程序的核心步骤如下:
首先,程序初始化了cURL库,为后续操作奠定了基础。然后,它创建了一个新的cURL会话实例,配置了目标URL,即,以及代理服务器信息,代理主机为duoip.cn,代理端口设为8000。
在设置阶段,程序还考虑了其他关键选项,如是否跟踪重定向、是否启用请求进度显示以及最大重定向次数。这些设置旨在确保请求的顺利进行。然而,这个基础版本的爬虫并未包含异常处理或错误检查,这些在实际应用中至关重要,以防网络问题或服务器响应异常。
爬虫通常指的是网络爬虫,就是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。因为python的脚本特性,python易于配置,对字符的处理也非常灵活,加上python有丰富的网络抓取模块,所以两者经常联系在一起。
在进入文章之前,我们首先需要知道什么是爬虫。爬虫,即网络爬虫,大家可以理解为在网络上爬行的一只蜘蛛,互联网就比作一张大网,而爬虫便是在这张网上爬来爬去的蜘蛛,如果它遇到自己的猎物(所需要的资源),那么它就会将其抓取下来。比如它在抓取一个网页,在这个网中他发现了一条道路,其实就是指向网页的超链接,那么它就可以爬到另一张网上来获取数据。不容易理解的话其实可以通过下面的图片进行理解:
因为python的脚本特性,python易于配置,对字符的处理也非常灵活,加上python有丰富的网络抓取模块,所以两者经常联系在一起。Python爬虫开发工程师,从网站某一个页面(通常是首页)开始,读取网页的内容,找到在网页中的其它链接地址,然后通过这些链接地址寻找下一个网页,这样一直循环下去,直到把这个网站所有的网页都抓取完为止。如果把整个互联网当成一个网站,那么网络蜘蛛就可以用这个原理把互联网上所有的网页都抓取下来。
作为一门编程语言而言,Python是纯粹的自由软件,以简洁清晰的语法和强制使用空白符进行语句缩进的特点从而深受程序员的喜爱。举一个例子:完成一个任务的话,c语言一共要写1000行代码,java要写100行,而python则只需要写20行的代码。使用python来完成编程任务的话编写的代码量更少,代码简洁简短可读性更强,一个团队进行开发的时候读别人的代码会更快,开发效率会更高,使工作变得更加高效。
这是一门非常适合开发网络爬虫的编程语言,而且相比于其他静态编程语言,Python抓取网页文档的接口更简洁;相比于其他动态脚本语言,Python的urllib2包提供了较为完整的访问网页文档的API。此外,python中有优秀的第三方包可以高效实现网页抓取,并可用极短的代码完成网页的标签过滤功能。
python爬虫的构架组成如下图:
1、URL管理器:管理待爬取的url集合和已爬取的url集合,传送待爬取的url给网页下载器;
2、网页下载器:爬取url对应的网页,存储成字符串,传送给网页解析器;
3、网页解析器:解析出有价值的数据,存储下来,同时补充url到URL管理器。
而python的工作流程则如下图:
(Python爬虫通过URL管理器,判断是否有待爬URL,如果有待爬URL,通过调度器进行传递给下载器,下载URL内容,并通过调度器传送给解析器,解析URL内容,并将价值数据和新URL列表通过调度器传递给应用程序,并输出价值信息的过程。)
通过前面几期的推送,小编基本上已经将R语言爬虫所需要的基本知识介绍完了。R虽然是以一门统计分析工具出现在大多数人印象中的,但其毕竟本质上是一门编程语言,对于爬虫的支持虽不如Python那样多快好省,但悉心研究一下总能做出一些让你惊喜的效果。
大约很早之前,小编就写过关于R语言爬虫新贵rvest的抓取介绍,之前说rvest+SelectGadgetor是结构化网页抓取的实战利器,大家的溢美之词不断。详情可见推文:
R语言爬虫利器:rvest包+SelectorGadget抓取链家杭州二手房数据
但网络爬虫这个江湖太险恶,单靠一招rvest行走江湖必然凶多吉少,一不小心碰到什么AJAX和动态网页凭仅掌握rvest的各位必定束手无策。本文小编就简单介绍下在用R语言进行实际的网络数据抓取时如何将动态数据给弄到手。
所谓动态网页和异步加载,在之前的系列4的时候小编已通过AJAX介绍过了,简单而言就是我明明在网页中看到了这个数据,但到后台HTML中却找不到了,这通常就是XHR在作祟。这时候我们就不要看原始的HTML数据了,需要进行二次请求,通过web开发者工具找到真实请求的url。下面小编就以两个网页为例,分别通过GET和POST请求拿到动态网页数据,全过程主要使用httr包来实现,httr包可谓是RCurl包的精简版,说其短小精悍也不为过。httr包与RCurl包在主要函数的区别如下所示:
GET请求抓取微信好友列表数据
很早之前圈子里就看到过用Python抓取自己微信好友数据的案例分享,今天便以微信网页版为例,探一探其网页结构。首先登录个人微信网页版,右键打开web开发者工具,下来一大堆请求:
简单找一下发现网页中的微信好友列表信息并没有呈现在HTML中,大概可以断定微信好友数据是通过动态加载来显示的,所以直接定位到XHR中,经过几番尝试,结合右侧的preview,我们会发现大量整齐划一的数据,所以二次请求的url真的就是它了:
找到真正的url之后,接下来就是获取请求信息了,切换到Headers版块,Header版块下的4个子信息我们都需要关注,它们是我们构造爬虫请求头的关键。
从Header中我们可以看到该信息是通过GET方法请求得到的,General信息下的RequestURL,RequestMethod,StatusCode;ResponseHeaders信息下的Connection,Content-Type;RequestHeaders信息下的Accept,Cookie,Referer,User-Agent以及最后的QueryStringParameters都是我们需要重点关注的。
找到相应的信息之后,我们便可以直接利用httr包在R中构建爬虫请求:
#传入微信cookie信息Cookie<-“我的微信cookie”#构造请求头headers<-c('Accept'='application/json','Content-Type'='text/plain','User-Agent'='Mozilla/5.0(WindowsNT6.1)AppleWebKit/537.36(KHTML,likeGecko)Chrome/49.0.2623.221Safari/537.36SE2.XMetaSr1.0','Referer'='https://wx.qq.com/','Connection'='keep-alive','cookie'=Cookie)
二次请求实际的url:
#实际请求的urlurl<-"https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxgetcontact?r=1507597918348seq=0skey=@crypt_ee7cd3e3_70091604da65a07600cfdca47b81cfaf"
GET方法单次执行请求:
#执行请求louwill<-GET(url,add_headers(.headers=headers))
响应结果如下:
->GET/cgi-bin/mmwebwx-bin/webwxgetcontact?r=1507597918348seq=0skey=@crypt_ee7cd3e3_70091604da65a07600cfdca47b81cfafHTTP/1.1->Host:wx.qq.com->Accept-Encoding:gzip,deflate->Accept:application/json->Content-Type:text/plain->User-Agent:Mozilla/5.0(WindowsNT6.1)AppleWebKit/537.36(KHTML,likeGecko)Chrome/49.0.2623.221Safari/537.36SE2.XMetaSr1.0->Referer:https://wx.qq.com/->Connection:keep-alive->cookie:我的微信cookie-><-HTTP/1.1200OK<-Connection:keep-alive<-Content-Type:text/plain<-Content-Encoding:gzip<-Content-Length:90977<-
响应状态码为200,okay。
从响应中提取原始字符内容:
content(louwill)[1]"{"BaseResponse":{"Ret":0,"ErrMsg":""},"MemberCount":658,"MemberList":[{"Uin":0,"UserName":"weixin","NickName":"微信团队","HeadImgUrl":"/cgi-bin/mmwebwx-bin/webwxgeticon?seq=570002username=weixinskey=@crypt_ee7cd3e3_70091604da65a07600cfdca47b81cfaf","ContactFlag":1,"MemberCount":0,"MemberList":[],"RemarkName":"","HideInputBarFlag":0,"Sex":0,"Signature":"微信团队官方帐号","VerifyFlag":56,"OwnerUin":0,"PYInitial":"WXTD","PYQuanPin":"weixintuandui","RemarkPYInitial":"","RemarkPYQuanPin":"","StarFriend":0,"AppAccountFlag":0,"Statues":0,"AttrStatus":4,"Province":"","City":"","Alias":"","SnsFlag":0,"UniFriend":0,"DisplayName":"","ChatRoomId":0,"KeyWord":"wei","EncryChatRoomId":"","IsOwner":0},{"Uin":0,"UserName":"@34c5cc09db0a616522f7ccc7309b1d29","NickName":"微信支付...<truncated>
从结果中可以看出,微信好友列表的信息就被抓取下来了,数据信息非常杂乱,需要进一步清洗整理,小编这里重在展示GET请求获取动态网页数据(主要是懒)就不往下整理啦。
POST请求抓取网易云课堂数据
虽说动态网站数据请求也有GET方法的,但小编发现POST方法才是动态网页的主要的请求方式。受杜老师小魔方文章启发,小编也试一下这个网页上的效果。登录网易云课堂账号,右键开发者工具,直接定位到XHR,查找课程数据属于哪个url。通过尝试和preview,可以发现课程信息都被封装在一个studycourse.json的文件中:
跟GET请求方法一样,切换到Header版块后继续关注General等四个子信息,但POST请求下我们需要注意的一点是:POST请求下没有像GET请求一样的QueryStringParameters,而是由RequestPayload来构造请求头表单参数,这一点和GET方法大不相同。总而言之,在动态网页的HTTP请求中,如果是GET请求,请求头表单参数以name=valuename1=value1的形式直接附在url后面,如果是POST请求,请求头表单参数以相同的形式放在构造的表单体中,所以对于网易云课堂的数据请求在R中构造如下:
#构造请求头#这里小编没有登录账号,cookie就不要了headers<-c('Accept'='application/json','Content-Type'='application/json','User-Agent'='ozilla/5.0(WindowsNT6.1)AppleWebKit/537.36(KHTML,likeGecko)Chrome/49.0.2623.221Safari/537.36SE2.XMetaSr1.0','edu-script-token'='37aa682d1473455c8a77e6a4476e8f9e','Referer'='http://study.163.com/courses','Connection'='keep-alive')#POST请求需要构造请求头表单参数payload<-list('pageIndex'=1,'pageSize'=50,'relativeOffset'=0,'frontCategoryId'=-1)
二次请求实际的url:
url<-"http://study.163.com/p/search/studycourse.json"
POST方法单次执行请求:
louwill2<-POST(url,add_headers(.headers=headers),body=payload,encode="json")
结果如下:
->POST/p/search/studycourse.jsonHTTP/1.1->Host:study.163.com->Accept-Encoding:gzip,deflate->Cookie:EDUWEBDEVICE=5d0eadccd2314c4d8bc6e758b8b23d4e;NTESSTUDYSI=d3d36984547a43d6924334ee6a184a08->Accept:application/json->Content-Type:application/json->User-Agent:ozilla/5.0(WindowsNT6.1)AppleWebKit/537.36(KHTML,likeGecko)Chrome/49.0.2623.221Safari/537.36SE2.XMetaSr1.0->edu-script-token:83de95a25f5d45eb84bfeff8ec334e15->Referer:http://study.163.com/courses->Connection:keep-alive->cookie:网易云课堂cookie->Content-Length:69->>>{"pageIndex":1,"pageSize":50,"relativeOffset":0,"frontCategoryId":-1}<-HTTP/1.1200OK<-Server:nginx<-Date:Tue,10Oct201708:29:51GMT<-Content-Type:application/json;charset=UTF-8<-Transfer-Encoding:chunked<-Connection:keep-alive<-Vary:Accept-Encoding<-Server-Host:hzayq-study-platform7<-Content-Encoding:gzip<-Response[http://study.163.com/p/search/studycourse.json]Date:2017-10-1008:29Status:200Content-Type:application/json;charset=UTF-8Size:71kB
请求状态码200,也okay。
从响应中提取原始字符内容:
head(content(louwill2))$result$list[[39]]$result$list[[39]]$productId[1]1002971001$result$list[[39]]$courseId[1]1002971001$result$list[[39]]$productName[1]"英语知识点解析及小学单词带读"$result$list[[39]]$productType[1]0$result$list[[39]]$startTime[1]-1$result$list[[39]]$endTime[1]9.223372e+18$result$list[[39]]$description[1]"通过几分钟的微课片段,精讲中小学的英语知识点,让学生通过比较学习,把这些知识点编织成有系统的知识网。"$result$list[[39]]$provider[1]"中小学英语语法王"
跟前面一样,后续的数据处理与清洗小编就懒得弄啦。POST方法与GET方法略有区别,就是需要构造请求头表单参数。R语言针对动态网页抓取,使用RCurl/httr包,认真分析网页结构,一般都能搞定。
End.运行人员:中国统计网小编(微信号:itongjilove)
微博ID:中国统计网
中国统计网,是国内最早的大数据学习网站,公众号:中国统计网
http://www.itongji.cn电话+V: 192606-48052
机构由一批拥有10年以上开发管理经验,且来自互联网或研究机构的IT精英组成,负责研究、开发教学模式和课程内容。公司具有完善的课程研发体系,一直走在整个行业发展的前端,在行业内竖立起了良好的品质口碑。