注册 登录
编程论坛 VFP论坛

简单的 VFP 爬虫:爬取【百度百科】网络条目

cssnet 发布于 6 小时前, 30 次点击
对于我来说,所谓“爬虫”,无非是根据事先整理、设定好的网址条目,偷偷摸摸去爬取目标网站的内容。
——仅此而已。
至于,输入一个首页网址,然后自动逐级地解析出下级、下下级、下下下级网页来……我不会狂妄地企图用 VFP 代码去作这种繁琐的网页标记解析,那不是我该干的事情。
若有这种需求,十几年前,我会直接提交给 WepZip 6.0/7.0 去干。
后来发觉,将人家整站一锅端了,也没甚么鸟用!垃圾一大堆,有那工夫排查整理,倒不如自己重头做一个!
所以,十几年来,我再也不当这种仓鼠了。
一般是,用正则表达式整理出完整的下载索引,然后,让“爬虫”小程序批量爬取下来即可。
【百度百科】,根本没有完整的网址索引,故而,无非是自己事先整理一份感兴趣的词目列表,然后逐个逐个词目去撞它!

* --------------------
* BaiDuBaiKe.prg
* 尝试爬取【百度百科】网络条目
* 百度百科的网址规律:
* https://baike.baidu.com/item/xxxx
* 待解决的问题:
* 百度从来都不是什么善茬,也不是傻子,其反爬机制严格限制了短时间内的高频或异常访问。
* 故而,爬虫程序需完善的绝非程序运行速度问题,而是如何设置访问延迟,确保不会触发封禁!
* 比如:每60秒最多10次请求,设置等待时间为3~10秒的随机数,每小时最多1000次……等等。
* --------------------
clear all
close all

public aAgents[5]
aAgents[1] = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
aAgents[2] = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36"
aAgents[3] = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
aAgents[4] = "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:89.0) Gecko/20100101 Firefox/89.0"
aAgents[5] = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.1.1 Safari/605.1.15"

LOCAL lcKeyword, lcURL, lcSourceCode
LOCAL oxhttp AS Microsoft.xmlhttp
lcBaiduItem = "https://baike.baidu.com/item/"
rand(-1)

use BaiDuBaiKe
scan
    lcKeyword = alltrim(keyword)
    lcURL = lcBaiduItem + lcKeyword

    TRY
        oxhttp = CREATEOBJECT("WinHttp.WinHttpRequest.5.1")
        oxhttp.OPEN("GET", lcURL, .F.)
        * 模拟浏览器头,以便最大程度地“欺骗”目标网站 User-Agent 验证程序!
        oxhttp.SetRequestHeader("User-Agent", aAgents[INT(RAND() * 5) + 1])
        oxhttp.SetRequestHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8")
        oxhttp.SetRequestHeader("Accept-Language", "zh-CN,zh;q=0.9,en;q=0.8")
        oxhttp.SetRequestHeader("Connection", "keep-alive")
        oxhttp.SetRequestHeader("Upgrade-Insecure-Requests", "1")
        oxhttp.SEND()
        lcSourceCode = oxhttp.responseBody
        if ! empty(lcSourceCode) and empty(at("error.html", lcSourceCode))
            replace Detail with lcSourceCode
            strTofile(lcSourceCode, "html/" + lcKeyword + ".htm")
        endif
    CATCH TO oException
        ? "爬取异常: " + oException.Message
        RETURN .F.
    FINALLY
        RELEASE oxhttp
    ENDTRY
endscan

return

只有本站会员才能查看附件,请 登录
1 回复
#2
camsion6 小时前
百度文库的可以爬吗
1