【问题标题】:How to scrape all url inside a columns in a dataframe如何抓取数据框中列内的所有网址
【发布时间】:2019-06-12 20:16:52
【问题描述】:

很抱歉这个问题,但我是 python 新手,对我来说这个问题非常困难。

我正在处理这个 csv (https://www.kaggle.com/jtrofe/beer-recipes),我需要进行抓取。

问题是在数据框的列(URL)中有一部分链接,而主要部分(https://www.brewersfriend.com)没有声明。我想从每个 url 中抓取各种啤酒的评分。

对我来说这很复杂。

我希望有人可以帮助我!非常感谢。

【问题讨论】:

  • 您确定该网站允许根据其政策进行抓取吗?没检查过。所以一般来说,我知道 pandas 已经可以从 url 中提取表格,但对我来说,这个功能似乎有它的局限性,所以我想你必须实现一些抓取逻辑。也许它可以帮助您尝试漂亮的汤(由 python 中的 bs4 导入)并将抓取的内容插入数据框中。 BS4 相当强大!
  • 美汤期望得到html(或xml)代码,只用于解析,功能非常强大。您需要自己检索代码。您可以为此使用“请求”库。

标签: python pandas dataframe web-scraping


【解决方案1】:

https://www.kaggle.com/jtrofe/beer-recipes 上的数据快照中似乎有一个 url。您要从中抓取的实际网址是 https://www.brewersfriend.com/ 。然后对于每一行,您将附加数据集中的 url。

例如,第一个要抓取的是: https://www.brewersfriend.com/homebrew/recipe/view/1633/vanilla-cream-ale

为了刮掉这个,你可以做一些简单的事情,比如:

from urllib.request import urlopen
url='https://www.brewersfriend.com/homebrew/recipe/view/1633/vanilla-cream-ale'
html = urlopen(url)
print(html.read())
#Then extract the rating from the html

唯一的问题是当我尝试抓取它时,我收到 403 禁止错误...但这将是一个单独的问题。

一旦您开始抓取工作,您就可以遍历每个数据点并抓取评分。希望这可以帮助您开始!

【讨论】:

    【解决方案2】:

    您可以模仿页面执行的 POST 请求来添加额外的行,而是更改要返回的记录参数以检索总行数。您可以从原始页面中抓取总数,也可以将其硬编码(假设它是一个固定的数据集)。您可以解析为整个数据集的所有链接返回的 json,然后将域和协议简单地连接到相对 url,如下所示。

    请检查有关使用此端点/抓取的条款和条件。

    import requests, re
    
    p = re.compile(r'dataviewToken":"(.*?)"')
    p1 = re.compile(r'"rowCount":(\d+)')
    
    with requests.Session() as s:
        r = s.get('https://www.kaggle.com/jtrofe/beer-recipes')   
        token = p.findall(r.text)[0]
        rows = int(p1.findall(r.text)[0])
        data = {"jwe":{"encryptedToken": token},"source":{"type":3,"dataset":{"url":"jtrofe/beer-recipes","tableType":1,"csv":{"fileName":"recipeData.csv","delimiter":",","headerRows":1}}},"select":["BeerID","Name","URL","Style","StyleID","Size(L)","OG","FG","ABV","IBU","Color","BoilSize","BoilTime","BoilGravity","Efficiency","MashThickness","SugarScale","BrewMethod","PitchRate","PrimaryTemp"],"skip":0,"take": rows}
        base = 'https://www.brewersfriend.com'
        r = s.post('https://www.kaggleusercontent.com/services/datasets/kaggle.dataview.v1.DataViewer/GetDataView', json = data).json()
        links = [base + row['text'][2] for row in r['dataView']['rows']]]['rows']]
    

    【讨论】:

    • 你试过了吗?
    猜你喜欢
    • 2018-06-09
    • 1970-01-01
    • 1970-01-01
    • 2020-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多