【问题标题】:Python - Using pandas and enumerate for web crawlingPython - 使用 pandas 和枚举进行网络爬取
【发布时间】:2017-09-20 00:07:00
【问题描述】:

所以最近在网上找到了这段代码段,是用python写的,使用了pandas中的enumerate表达式。

import pandas as pd
url = 'http://myurl.com/mypage/'

for i, df in enumerate(pd.read_html(url)):
    df.to_csv('myfile_%s.csv' % i)

有没有办法重写它,以便它可以通过网页列表而不是单个 url 并将每个页面表中的所有信息放入单个 .csv 文件中?我的主要猜测有点像 for 循环。

url_base = 'http://myurl.com/mypage/'
count = 1
for i in range(1,5):

    url = '%s%s' %(url_base,count)

    for i, df in enumerate(pd.read_html(url)):
        df.to_csv('myfile_%s.csv' % i)
    count = count + 1  

【问题讨论】:

  • 您在两个循环中都有 i 作为变量;这是允许的,但要避免。

标签: python pandas web-crawler


【解决方案1】:

如果你所有的 csv 都有相同的列,你可以这样做

pd.concat([pd.read_html(url) for url in urls], ignore_index=True)

如果您的网址与示例中的网址具有相同的基础,您会这样做

url_base = 'http://myurl.com/mypage/{}'
df = pd.concat([pd.read_html(base.format(i)) for i in range(num)], ignore_index=True)
df.to_csv('alldata.csv')

【讨论】:

  • 这在当前代码中会出现在哪里?还是它自己的代码段?
  • 它将替换您的所有代码。您是否有实际示例正在尝试做。
【解决方案2】:

这个怎么样?

import pandas as pd
from concurrent import futures

urls = [your list of urls]

def read_html(url):
    return pd.read_html(url)

with futures.ThreadPoolExecutor(max_workers=6) as executor:
    fetched_urls = dict((executor.submit(read_html, url), url)
                         for url in urls)

nums = range(1, len(fetched_url)+1)

for future, num in zip(futures.as_completed(fetched_urls), nums):
    if future.result():
        future.result().to_csv('myfile_{}.csv'.format(num), index=False)
    elif future.exception():
        print '{} yielded no results'.format(fetched_urls[future])
    else:
        pass

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多