Python - Web Scraping并发改进我的代码?

时间:2017-09-11 10:54:44

标签: python web-scraping

所以我拉动了NFL球员的统计数据。该表仅显示最多50行,因此我必须将其过滤以确保我不会错过任何统计信息,这意味着我会遍历页面以按季度收集所有数据,按位置,按周,团队。

我想出了网址如何变化以循环使用这些网页,但迭代过程需要很长时间,并且在想:我们能够同时打开多个网页,我无法做到并行运行这些进程,每个进程同时从每个页面收集数据,将其存储在temp_df中,然后在最后将它们全部合并...而不是收集一个url,一个url,然后合并,然后是下一个url,然后合并,然后接下来,......一次。这意味着迭代6,144次(如果我没有遍历位置),但是这些位置超过36,000次迭代。

但我仍然坚持如何实施它,或者它是否可能。

这是我目前正在使用的代码。我通过位置消除了循环,只是想知道它的工作方式,对于四分卫来说,p = 2。

所以它开始于2005赛季= 1,球队1 = 1,第1周= 0,然后迭代所有那些到2016年的最后一个赛季= 12,球队32 = 33,第16周= 17:

import requests
import pandas as pd

seasons = list(range(1,13))
teams = list(range(1,33))
weeks = list(range(0,17))


qb_df = pd.DataFrame()

p = 2
for s in seasons:
    for t in teams:
        for w in weeks:
        url = 'https://fantasydata.com/nfl-stats/nfl-fantasy-football-stats.aspx?fs=2&stype=0&sn=%s&scope=1&w=%s&ew=%s&s=&t=%s&p=%s&st=FantasyPointsFanDuel&d=1&ls=FantasyPointsFanDuel&live=false&pid=true&minsnaps=4' % (s,w,w,t,p)
        html = requests.get(url).content
        df_list = pd.read_html(html)
        temp_df = df_list[-1]
        temp_df['NFL Season'] = str(2017-s)
        qb_df = qb_df.append(temp_df, ignore_index = True)


file = 'player_data_fanduel_2005_to_2016_qb.xls'
qb_df.to_excel(file)               
print('\nData has been saved.')

2 个答案:

答案 0 :(得分:1)

1 /创建季节,团队,周和网址的字典。

2 /使用multiprocessing pool来调用网址并获取数据。

或使用像Scrapy这样的专用刮擦工具。

答案 1 :(得分:1)

首先,您必须记住,某些服务器会识别来自IP的令人惊讶的负载并阻止您的访问(有自动执行此操作的互联网设备),因此您可能不想发出数百个请求并行。

如果您不使用Scrapy之类的内容,则无需采用多线程或多处理方式。您可能最好使用异步I / O. Python 3.5非常好地支持异步函数。它们非常容易使用。