【问题标题】:Scraping string from a large number of URLs with Julia使用 Julia 从大量 URL 中抓取字符串
【发布时间】:2021-01-01 14:05:56
【问题描述】:

新年快乐!

我刚刚开始学习 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)

【问题讨论】:

    标签: web-scraping julia


    【解决方案1】:

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

    基本上,由于抓取是 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
    

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

    【讨论】:

    • 谢谢!很有用。这对我来说是一个新功能,所以有点困难,但会继续阅读以解决它!谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-31
    • 2013-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-09
    • 2023-03-23
    相关资源
    最近更新 更多