V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
ydxred
V2EX  ›  程序员

PHP 写一个爬虫(v 友注意详细看正文详情)

  •  
  •   ydxred ·
    ydxred · 2017-03-15 12:40:15 +08:00 · 3916 次点击
    这是一个创建于 2809 天前的主题,其中的信息可能已经有所发展或是发生改变。

    接到一个任务要我写一个爬虫!可是我暂时只会 php,但是 php 写爬虫不是强项!v 友有用 php 写过爬虫的吗?有个开源项目推荐借鉴参考一下!或者说我现在去学习 python 星期五能完成好一个爬虫吗!爬出来的数据要写进数据储存的!谢谢了

    35 条回复    2017-03-16 10:30:23 +08:00
    golmic
        1
    golmic  
       2017-03-15 12:46:09 +08:00 via Android
    有偿提供 python 爬虫解决方案
    zqhong
        2
    zqhong  
       2017-03-15 12:55:01 +08:00
    gouchaoer 同学的爬虫经验分享: https://www.v2ex.com/t/324309

    另外可以看下这个: https://github.com/owner888/phpspider
    slince
        3
    slince  
       2017-03-15 12:55:04 +08:00
    https://github.com/slince/spider 确实不是强项,单线程爬的
    shoaly
        4
    shoaly  
       2017-03-15 12:56:34 +08:00
    假设你 php 基本功 已经会数据库了 也会发出 get, post 请求 获取 response
    那么你离 爬虫只差了一个 正则的距离
    lecher
        5
    lecher  
       2017-03-15 12:59:38 +08:00
    任何语言只要能发网络请求都可以写爬虫。
    python 爬虫通常是用增强库,用来帮助解析网页数据。
    php 写爬虫通常是用 curl 库+re 正则解析,可以借助 curl 的库做很多参数设置, header cookie 之类的。抽取数据是靠正则来做解析。需要自己写任务管理。
    如果爬虫是强嵌入原有业务的,比如需要取很多业务数据做检测,那就用 php 继续写爬虫,封装一个 curl 的处理接口,然后写一个多进程任务管理,要用到命令行的库,通常要借助 mysql 、 redis 之类的做进程间数据同步。

    如果仅仅只是为了一次性抓取数据, python 上手也很快,一周绰绰有余。
    jarlyyn
        6
    jarlyyn  
       2017-03-15 13:13:16 +08:00   ❤️ 1
    ydxred
        7
    ydxred  
    OP
       2017-03-15 13:17:14 +08:00
    @lecher 大神,python 基本语法会啊!周五交能赶上吗? 今天周三了
    icemanpro
        8
    icemanpro  
       2017-03-15 13:19:19 +08:00
    火车采集
    pubby
        9
    pubby  
       2017-03-15 13:39:56 +08:00 via Android
    一直用 php 爬,按功能分开写(目标网址预处理,抓取,分析....),用队列。多开几个抓取进程同样可以跑满带宽。
    fuxkcsdn
        10
    fuxkcsdn  
       2017-03-15 13:44:52 +08:00
    前提是你要爬什么?目标网站限制爬虫吗?如何限制

    BTW , PHP 写爬虫效率不比 python 差

    有偿提供 PHP 爬虫方案 XD
    Felldeadbird
        11
    Felldeadbird  
       2017-03-15 14:21:05 +08:00   ❤️ 2
    jquery 会吧。用这个库,分分钟教你做人。 https://querylist.cc/
    keller
        12
    keller  
       2017-03-15 14:24:05 +08:00
    你需要的可能是火车头采集器
    FYK
        13
    FYK  
       2017-03-15 14:29:14 +08:00
    同 2 楼, phpspider
    exalex
        14
    exalex  
       2017-03-15 14:38:12 +08:00
    @pubby 有博客嘛
    exalex
        15
    exalex  
       2017-03-15 14:38:26 +08:00
    @fuxkcsdn 有偿是多少钱
    cdwyd
        16
    cdwyd  
       2017-03-15 14:42:31 +08:00 via Android
    同有偿,二楼优先😁
    价格看复杂程度,平价接单
    silov
        17
    silov  
       2017-03-15 14:45:46 +08:00
    分两步,第一步抓取: Snoopy.class.php
    第二步解析内容: Simple Html Dom

    两个关键词直接百度就可以把工具类拿来用了,挺简单的。
    sxm
        18
    sxm  
       2017-03-15 15:08:57 +08:00
    简单的就是 curl 获取页面内容,然后就是写正则提取需要的数据了。

    之前某论坛要关闭,我是花了 2 个夜晚写了 PHP 抓取程序把那个论坛的数据都抓下来了并入库。因为单进程抓取速度太慢,又写了个多进程页面管理,前端页面能实时查看各个进程的抓取速度,开新进程或者结束指定进程等等。
    curl 获取页面, redis 做队列, access 做数据库(喜欢单个文件数据库,小巧方便带走)
    lijinma
        19
    lijinma  
       2017-03-15 15:12:23 +08:00
    这帮人,每人推荐个靠谱的。。
    lijinma
        20
    lijinma  
       2017-03-15 15:12:41 +08:00
    我来推荐个靠谱简单的 https://github.com/FriendsOfPHP/Goutte
    scnace
        21
    scnace  
       2017-03-15 15:21:41 +08:00 via Android
    任何语言的爬虫的实践都差不多吧。 http get/post + 分析 request header +DOM selector/XPath/正则(这是基础的
    再上去就是集成啥 headless browser /proxypool/分布式调度啥的了
    Moker
        22
    Moker  
       2017-03-15 16:15:36 +08:00
    我现在也是 PHP 写爬虫 还行 在 PHPQUERY 解析
    bonfy
        23
    bonfy  
       2017-03-15 16:21:59 +08:00 via iPhone
    同有偿 楼上的都优先
    ydxred
        24
    ydxred  
    OP
       2017-03-15 16:52:12 +08:00
    @sxm 能不用 redis 吗?
    mrcn
        25
    mrcn  
       2017-03-15 17:23:22 +08:00
    我记得有个库叫 PHPQUERY
    很好用,类似 jQuery 一样直接用选择器就好
    不过 PHP 的多线程……
    appppap
        26
    appppap  
       2017-03-15 17:30:23 +08:00 via iPhone
    有偿约炮
    benbenlang
        27
    benbenlang  
       2017-03-15 17:33:26 +08:00
    楼主能帮忙给我爬几个用户 ID 吗?
    sxm
        28
    sxm  
       2017-03-15 17:52:30 +08:00   ❤️ 1
    @ydxred 我用 redis 作用是做队列,先把要抓取的页面 ID 全部 push 进去,然后抓取页面就从 redis 里 pop 一个页面 ID 出来去抓取,所以多运行几个 php 页面就能提升抓取速度,相当于多进程模仿多线程。本来是不用 redis 的,因为 access 并发读取修改的问题,用文件锁都锁不住。
    tammy
        29
    tammy  
       2017-03-15 18:44:10 +08:00 via iPad
    @lecher PHP 写爬虫感觉没比 shell 方便多少
    uzumaki
        30
    uzumaki  
       2017-03-15 19:12:18 +08:00 via Android
    不采集 https 的话 其实 dedecms 就行啊
    HanSonJ
        31
    HanSonJ  
       2017-03-15 19:51:41 +08:00
    guzzle + domcrawler
    lecher
        32
    lecher  
       2017-03-15 19:58:37 +08:00 via Android
    @tammy 我个人感觉是,如果原来的业务用什么语言,需要抓取数据的时候,就看是不是特别嵌入原来的业务,需要特别频繁调用原有数据做检测的,那就用原来项目的语言,可以很方便的复用原有项目的代码做检测和插入数据。

    爬虫这类的业务可大可小,用什么脚本语言写,性能都不会有特别明显的差距,主要还是看工程规范,用什么语言写全看团队成员的技术栈。

    我个人比较喜欢 curl 库+v8 库+正则的方案。 curl 库解决 header cookies https 的各种问题, v8 解决某些 js 加密的问题。正则解决抽取数据的问题。 CPU 和内存消耗都比较低。

    然而实际上如果只考虑一个语言的话, nodejs 解决所有问题。
    pheyer
        33
    pheyer  
       2017-03-15 20:49:52 +08:00
    看看这个 PHPSpider : https://doc.phpspider.org/
    figofuture
        34
    figofuture  
       2017-03-16 10:13:18 +08:00
    看看这篇文章,分分钟搞定一个爬虫程序 https://www.figotan.org/2016/08/10/pyspider-as-a-web-crawler-system/
    MiguelValentine
        35
    MiguelValentine  
       2017-03-16 10:30:23 +08:00
    周五, py ,来得及
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2730 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 02:07 · PVG 10:07 · LAX 18:07 · JFK 21:07
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.