如何在数据框中的列内抓取所有url

时间:2019-06-12 20:16:52

标签: python pandas dataframe web-scraping

抱歉,我是python的菜鸟,对我来说,这个问题非常困难。

我正在处理此csv(https://www.kaggle.com/jtrofe/beer-recipes),并且需要抓取。

问题在于,数据框的列(URL)中有一部分链接,而没有声明主要部分(https://www.brewersfriend.com)。我想从每个网址中刮除各种啤酒的等级。

对我来说,这很复杂。

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

2 个答案:

答案 0 :(得分:0)

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

例如,第一个要抓取的是:  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禁止错误...,但这将是一个单独的问题。

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

答案 1 :(得分:0)

您可以模仿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']]