问题:使用 Julia 从大量 URL 中抓取字符串

新年快乐!

我刚刚开始学习 Julia,我为自己设定的第一个小挑战是从大量 URL 列表中抓取数据。

我在 CSV 文件中有 ca 50k URL(我使用 Julia 使用 Regex 从 JSON 成功解析了这些 URL)。我想抓取每一个并返回一个匹配的字符串(“/page/12345/view” - 其中 12345 是任何整数)。

我设法使用 HTTP 和 Queryverse 做到了这一点(虽然从 CSV 和 CSVFiles 开始,但出于学习目的查看包)但脚本似乎在不到 2k 后停止。我看不到诸如超时之类的错误。

请问是否有人可以建议我做错了什么或者我可以如何以不同的方式处理它?学习资源的解释/链接也很棒!

using HTTP, Queryverse


URLs = load("urls.csv") |> DataFrame

patternid = r"\/page\/[0-9]+\/view"

touch("ids.txt")
f = open("ids.txt", "a")

for row in eachrow(URLs)

    urlResponse = HTTP.get(row[:url])
    if Int(urlResponse.status) == 404
        continue
    end

    urlHTML = String(urlResponse.body)

    urlIDmatch = match(patternid, urlHTML)

    write(f, urlIDmatch.match, "\n")

end

close(f)

解答

总有一个服务器会检测到你的爬虫并故意花费很长时间来响应。

基本上,由于抓取是 IO 密集型操作,您应该使用大量异步任务来完成。此外,这应该与get函数的readtimeout参数结合使用。因此,您的代码或多或少看起来像这样:

asyncmap(1:nrow(URLs);ntasks=50) do n
    row = URLs[n, :]
    urlResponse = HTTP.get(row[:url], readtimeout=10)
    # the rest of your code comes here
end

即使是一些服务器延迟传输,总是有很多连接在工作。

Logo

学AI,认准AI Studio!GPU算力,限时免费领,邀请好友解锁更多惊喜福利 >>>

更多推荐