存储刮擦结果并使用Python和Pandas搜索结果?

时间:2017-07-26 09:15:10

标签: python-3.x pandas web-scraping python-requests

作为我的博士学位的一部分研究,我正在抓取大量的网页,并在刮擦结果中搜索关键字。

到目前为止我是这样做的:

# load data with as pandas data frame with column df.url
df = pd.read_excel('sample.xls', header=0)

# define keyword search function

def contains_keywords(link, keywords):
    try:
        output = requests.get(link).text
        return int(any(x in output for x in keywords))
    except:
        return "Wrong/Missing URL"

# define the relevant keywords
mykeywords = ('for', 'bar')

# store search results in new column 'results'
df['results'] = df.url.apply(lambda l: contains_keywords(l, mykeywords))

这很好用。我只有一个问题:相关关键字mykeywords列表经常更改,而网页保持不变。运行代码需要很长时间,因为我request一遍又一遍。

我有两个问题:

(1)有没有办法存储request.get(link).text的结果?

(2)如果是这样,如何在保存的文件中搜索产生与当前脚本相同的结果?

一如既往,感谢您的时间和帮助! / R

1 个答案:

答案 0 :(得分:0)

您可以下载网址的内容并将其保存在目录中的单独文件中(例如:' links')

def get_link(url): 
    file_name = os.path.join('/path/to/links', url.replace('/', '_').replace(':', '_'))
    try: 
        r = requests.get(url)
    except Exception as e:
        print("Failded to get " + url)
    else:
        with open(file_name, 'w') as f: 
            f.write(r.text)

然后修改contains_keywords函数以读取本地文件,因此每次运行脚本时都不必使用requests

def contains_keywords(link, keywords):
    file_name = os.path.join('/path/to/links', link.replace('/', '_').replace(':', '_'))
    try: 
        with open(file_name) as f: 
            output = f.read()
        return int(any(x in output for x in keywords))
    except Exception as e:
        print("Can't access file: {}\n{}".format(file_name, e))
        return "Wrong/Missing URL"

编辑:我刚在get_link添加了一个try-except块,并使用file_name的绝对路径

相关问题