、概述
在进行网页数据采集时,PHP是一种常用的语言,它提供了多种设置方式来实现采集功能。本文将对这些设置方式进行评测和比较,以帮助读者选择最适合自己需求的方式。
二、使用cURL库
cURL是一个强大的开源库,可以实现各种网络通信功能。在PHP中,通过cURL库可以方便地进行网页数据的采集。使用cURL库的优点是操作灵活,可以模拟用户行为,支持多线程,并且对于反爬虫机制有一定的应对能力。然而,使用cURL库需要具备一定的网络编程知识,并且代码量相对较多。
三、使用file_get_contents函数
file_get_contents函数是PHP提供的一个简单易用的文件读取函数,在采集网页数据时也可以使用该函数。它的优点是代码简洁、易于理解和维护,适合简单的数据采集任务。然而,file_get_contents函数无法处理需要登录或带有反爬虫机制的网站。
四、使用第三方库Guzzle
Guzzle是一个流行的PHP HTTP客户端库,提供了丰富的功能和易用的接口。它支持并发请求、重试机制、cookie管理等特性,非常适合进行网页数据采集。使用Guzzle的优点是可以快速实现功能,代码清晰易读。但是,由于Guzzle是一个第三方库,需要额外安装和配置。
五、使用第三方工具Selenium
Selenium是一个自动化测试工具,也可以用于网页数据采集。它可以模拟浏览器行为,支持JavaScript渲染,适应复杂页面的采集。使用Selenium的优点是功能强大,适用于各种场景,并且有大量的学习资源可供参考。但是,相比其他方式,使用Selenium需要额外安装浏览器驱动程序,并且对系统资源消耗较大。
六、使用PhantomJS
PhantomJS是一个无界面的浏览器引擎,可以实现网页截图、页面渲染等功能。在进行网页数据采集时,也可以利用PhantomJS来获取网页内容。PhantomJS的优点是操作简单,支持多种语言调用,并且对JavaScript渲染有很好的支持。然而,PhantomJS已经停止维护,并且在部分情况下可能存在性能问题。
七、比较与选择
根据不同的需求和场景,选择合适的PHP设置方式是很重要的。如果需要灵活的操作和对抗反爬虫机制,可以选择使用cURL库;如果只是进行简单的数据采集,可以考虑使用file_get_contents函数;如果需要更多功能和易用性,可以尝试使用Guzzle或Selenium;如果对性能要求较高,可以考虑使用PhantomJS。综合考虑各种因素,选择最适合自己需求的设置方式。
八、总结
本文对PHP采集文章的设置方式进行了评测和比较,介绍了cURL库、file_get_contents函数、Guzzle、Selenium和PhantomJS等几种常用方式。根据不同的需求和场景,读者可以选择最适合自己的设置方式来实现网页数据采集。希望本文对读者在PHP采集文章方面有所帮助。
为一名资深网络编辑,我一直以来都非常关注着网络内容的质量和采集规则。近日,我有幸采访到了业界著名的 PHP 编程专家小李,并向他请教了关于 PHP 文章采集规则的实用技巧。在这篇文章中,我将与大家分享这些宝贵的经验和建议。
1.了解目标网站结构
小李告诉我,要想成功采集目标网站的文章,首先需要对目标网站的结构进行详细了解。通过分析网页源码、URL 参数等信息,可以更好地定位和提取目标文章。
2.使用合适的采集工具
针对不同的采集需求,小李推荐了几款功能强大、易于使用的 PHP 采集工具。例如,可以使用 Simple HTML DOM Parser 来解析 HTML 文档,并提取所需内容。
3.处理 JavaScript 渲染
现在很多网站都使用 JavaScript 进行页面渲染,这给采集带来了一定难度。小李建议可以利用无头浏览器(Headless Browser)来模拟浏览器行为,从而解决 JavaScript 渲染的问题。
4.设置合理的采集频率
在进行文章采集时,要注意设置合理的采集频率,避免给目标网站带来过大的访问压力。小李建议可以使用定时任务或者监控工具来控制采集频率,以免被目标网站封禁。
5.处理反爬虫机制
为了防止恶意爬虫对网站造成损害,很多网站都设置了反爬虫机制。小李提醒我们要注意处理这些机制,可以通过设置合适的 User-Agent、使用代理 IP 等方式来规避反爬虫策略。
6.数据清洗和去重
采集到的文章可能存在一些噪音数据和重复内容。小李建议在采集后进行数据清洗和去重处理,以提高数据质量和减少存储空间占用。
7.合法合规使用采集结果
在进行文章采集时,务必要遵守相关法律法规,并确保使用采集结果的合法性。小李强调了保护知识产权和个人隐私的重要性,呼吁大家要有责任心和法律意识。
8.不断学习和提升
最后,小李鼓励大家要不断学习和提升自己的采集技术。网络环境和网站结构都在不断变化,只有保持学习的态度,才能跟上时代的步伐。
通过与小李的交流,我深刻感受到了 PHP 文章采集规则的复杂性和挑战性。但同时,我们也看到了解决问题的方法和技巧。相信在大家共同努力下,我们一定能够更好地利用 PHP 技术进行文章采集,并为网络内容质量的提升做出更大的贡献!
理见《PowerQuery爬取网页终极攻略——Power Query网络爬取详解》。施阳大神的手笔。pqfans是个好去处,有兴趣的可以多瞄瞄。
URL:http://quote.stockstar.com/stock/ranklist_a_3_1_1.html
此为沪深A股数据,需要抓取1-20页的所有数据。点击下一页后观察URL发现,html前面最后一个数字即为页数,那么只需要自定义函数,将其做成变量然后调用即可。另外发现每一页的最后一行都是多余的,可以用Table.RemoveLastN删掉。
let get_data=(x)=>Table.RemoveLastN(Web.Page(Web.Contents("http://quote.stockstar.com/stock/ranklist_a_3_1_"&Text.From(x)&".html")){0}[Data],1), result=Table.Combine(List.Transform({1..20},get_data)) in result
URL:http://221.215.38.136/grcx/kscx/list.action?kscxVo.jsp=ylypmlcx.jsp
要抓取1-20页数据,但发现翻页URL不会变,无法根据URL控制页数。浏览器按F12发现,网页以get方式提交,图中参数4即为页数,表格的真实URL为http://221.215.38.136/grcx/pages/kscx/ylypmlcx.jsp?page_ylypmlcxQuery=4,于是方法同上。
let source=Table.Combine(List.Transform({1..20},each Web.Page(Web.Contents("http://221.215.38.136/grcx/pages/kscx/ylypmlcx.jsp?page_ylypmlcxQuery="&Text.From(_))){2}[Data])), result=Table.SelectRows(source, each not Text.StartsWith([药品编码], "当前")) in result
URL:http://www.drugfuture.com/cndrug/national.aspx?ApprovalDateStart=2016-01-01&ApprovalDateEnd=2016-12-31
和之前不同的是,该网页是以post方式提交,如果只是在URL后加参数无法得到正确的页数,于是要用到Web.Contents中的Content提交post参数,另外headers中的Content-Type是必须的,所以也要加进来。因为有个"-"为特殊符号,所以要加个#""。
需要注意的是,提交的参数需要是encode后的,__VIEWSTATE参数太长了,我没放进来,自己改一下。
let get_data=(page)=> let url="http://www.drugfuture.com/cndrug/national.aspx", headers=[#"Content-Type"="application/x-www-form-urlencoded"], content="__EVENTTARGET=GridViewNational&__EVENTARGUMENT=Page%24"&Text.From(page)&"&__VIEWSTATE=太长了自己改吧", query=[ApprovalDateStart="2016-01-01",ApprovalDateEnd="2016-12-31"], web_data=Web.Contents(url,[Query=query,Headers=headers,Content=Text.ToBinary(content)]), data=Table.RemoveLastN(Web.Page(Text.FromBinary(web_data))[Data]{0},1) in data, result=Table.Combine(List.Transform({1..78},get_data)) in result
URL:http://www.51mis.com/biaozhun/index.php?module=Accounts&action=index&parenttab=Parent%20Accounts
这是一个CRM的试用账户,现要抓出客户分类中的vip客户下的1-4页的所有信息。这里面有三个问题要解决:①需要登陆 ②点击客户分类下的任何子分类URL都不会变,如何定位到我们想要的vip客户 ③翻页问题
我们首先打开这个URL验证下手机号登陆,然后打开一个新窗口,再次打开这个URL,发现看到的已经和刚才不一样了,这是因为刚才登陆后服务器已经把所有的身份识别信息记录在cookies中,当再次访问的时候浏览器检查到本地有cookies,于是向服务器提交了一个headers中带有cookies的请求,验证通过。所以我们只需要复制cookies添加到headers中即可,问题①解决。
然后尝试点击客户分类下的不同子分类,对比发现有一个叫viewname的参数在变化,而vip客户对应的参数为179,问题②解决。
页码对应的则是start参数,上面介绍过,问题③解决。
let get_data=(page)=> let url="http://www.51mis.com/biaozhun/index.php", headers=[#"Content-type"="application/x-www-form-urlencoded",Cookie="ck_login_id_lingdang=201; ck_login_theme_lingdang=softed; ck_login_language_lingdang=zh_cn; IESESSION=alive; _qddamta_4008885110=3-0; pgv_pvi=1109719040; pgv_si=s9133628416; tencentSig=2914921472; Hm_lvt_15823373277d5586cce1d8fa22740e98=1498477295,1498478011; Hm_lpvt_15823373277d5586cce1d8fa22740e98=1498478011; LXB_REFER=www.baidu.com; _qddaz=QD.evgckn.ew8amb.j4e2ox3t; PHPSESSID=j0m2ou15d8hcumonfcul46kj64; _qdda=3-1.3bt43b; _qddab=3-i0t2ae.j4e2ox3v"], content="viewname=179&start="&Text.From(page), query=[action="index",module="Accounts"], web_data=Web.Contents(url,[Query=query,Headers=headers,Content=Text.ToBinary(content)]), table=Web.Page(Text.FromBinary(web_data)){0}[Data] in table, result=Table.RemoveColumns(Table.Combine(List.Transform({1..4},get_data)),{""}) in result
URL:http://sports.sina.com.cn/g/ucl/table.html
要抓取2011-2016所有欧冠积分榜数据。通过F12不难找到真实地址,去掉无关参数后为http://platform.sina.com.cn/sports_all/client_api?_sport_t_=football&_sport_s_=opta&_sport_a_=teamOrder&app_key=3571367214&type=10&season=2016。把这个地址复制到浏览器打开,发现出来的和上面的案例都不一样,返回的是json,那么就需要使用Json.Document来解析,其中season参数控制赛季,自定义函数后构建{2011..2016}的list调用即可:
let get_data=(x)=>Table.FromRecords(Json.Document(Web.Contents("http://platform.sina.com.cn/sports_all/client_api?_sport_t_=football&_sport_s_=opta&_sport_a_=teamOrder&app_key=3571367214&type=10&season="&Text.From(x)))[result][data]), result=Table.Combine(List.Transform({2011..2016},get_data)) in result
以上案例都有一个共同点:都为结构化数据,可以直接通过解析表或json等方式从而获取数据,但有些网页中的数据是非结构化的。
例如:爬取本站页面https://pqfans.com/catalog中所有的锚链接。
对于这种非结构化的网页,只能通过Text.FromBinary解析出源码,然后当文本处理。如果网页的编码为GBK或GB2312,Text.FromBinary的第二参数要加个0,否则会出现乱码,如果是UTF-8则不用第二参数。
let source=Text.FromBinary(Web.Contents("https://pqfans.com/catalog")), result=List.Transform({0..List.Count(Text.PositionOf(源,"<a href=""https://pqfans.com/",2))-1},each "https://pqfans.com/"&Text.BetweenDelimiters(源,"<a href=""https://pqfans.com/","""",_)) in result
对于动态参数,可以把变量写在单元格中,然后将单元格导入PQ,效果如下图:
修改单元格中的值,刷新即可得到不同日期、不同类型等数据,体验类似于网页中的查询。
URL:http://datacenter.mep.gov.cn/index!MenuAction.action?name=402880fb24e695b60124e6973db30011
请用以上介绍的方法,抓出2017/6/20-2017/6/23全部49页的全国城市空气质量日报。
来源于施阳大神。
*请认真填写需求信息,我们会在24小时内与您取得联系。