整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

php采集网页数据(php采集类)

php采集网页数据(php采集类)

、概述

在进行网页数据采集时,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是个好去处,有兴趣的可以多瞄瞄。

1、翻页URL会变化,直接get方式提交

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

2、翻页URL不会变化,F12找出真实地址

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

3、post方式提交

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

4、需要登录,加cookies

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

5、返回json:

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

6、非结构化数据:

以上案例都有一个共同点:都为结构化数据,可以直接通过解析表或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页的全国城市空气质量日报

来源于施阳大神。