使用 BeautifulSoup 从多个页面下载多线程文件的网页抓取

时间:2021-06-24 10:09:02

标签: python web-scraping beautifulsoup

我想从以下网站上使用相同的 html 标签从多个页面抓取多个下载按钮:

https://data.jakarta.go.id/dataset/indeks-standar-pencemaran-udara-ispu-tahun-2011 https://data.jakarta.go.id/dataset/indeks-standar-pencemaran-udara-ispu-tahun-2012 https://data.jakarta.go.id/dataset/indeks-standar-pencemaran-udara-ispu-tahun-2013

我曾尝试使用多线程进行网页抓取,但没有奏效。我的代码是这样的

import requests
import threading
from bs4 import BeautifulSoup as bs
import os

URLS = [
  'https://data.jakarta.go.id/dataset/indeks-standar-pencemaran-udara-ispu-tahun-2011',
  'https://data.jakarta.go.id/dataset/indeks-standar-pencemaran-udara-ispu-tahun-2012',
  'https://data.jakarta.go.id/dataset/indeks-standar-pencemaran-udara-ispu-tahun-2013',
]

def downloadPage(url, folder):
    os.mkdir(folder) # create folder
    
download_urls = []
filetype = '.csv'

def get_soup(url):
    return bs(requests.get(url).text, 'html.parser')

for link in get_soup(url).find_all('a'):
    file_link = link.get('href')
    if filetype in file_link:
        #print(file_link)
        download_urls.append(file_link)
        
for file in download_urls: # for each index and file in download_urls
    fileName = file.split('/')[-1] # the text after the last / is the file name we want
    fileRequest = requests.get(file) # download the file
    with open(os.path.join(folder, fileName), 'wb') as examFile: # open a new file in write and binary mode
        examFile.write(fileRequest.content) # write the content of the downloaded file
        
for URL in URLS:
  folderName = URL.split('/')[-1] # the name of the folder
  processThread = threading.Thread(
    target=downloadPage, args=(URL, folderName)) # parameters and functions have to be passed separately
  processThread.start() # start the thread

'''

它返回: NameError: 名称“文件夹”未定义

2 个答案:

答案 0 :(得分:0)

出现第 30 行的错误是因为您从未使用命名文件夹创建全局变量。只需在导入下的某处包含以下行。

url = URLS[0] # select first url
folder = '.' # select working directory as folder

答案 1 :(得分:0)

要从 3 个 URL 下载所有 CSV,您可以使用以下示例:

import os
import requests
from bs4 import BeautifulSoup


URLS = [
    "https://data.jakarta.go.id/dataset/indeks-standar-pencemaran-udara-ispu-tahun-2011",
    "https://data.jakarta.go.id/dataset/indeks-standar-pencemaran-udara-ispu-tahun-2012",
    "https://data.jakarta.go.id/dataset/indeks-standar-pencemaran-udara-ispu-tahun-2013",
]


for url in URLS:
    soup = BeautifulSoup(requests.get(url).content, "html.parser")

    folder = url.split("/")[-1]
    os.makedirs(folder, exist_ok=True)

    for a in soup.select('a[href$=".csv"]'):
        file_name = a["href"].split("/")[-1]

        print(
            "Downloading {} ...".format(os.path.join(folder, file_name)),
            end=" ",
        )
        with open(os.path.join(folder, file_name), "wb") as f_out:
            f_out.write(requests.get(a["href"]).content)
        print("OK.")

将 CSV 文件下载到 3 个文件夹中:

indeks-standar-pencemaran-udara-ispu-tahun-2011
├── Indeks-Standar-Pencemar-Udara-di-Provinsi-DKI-Jakarta-Bulan-Agustus-Tahun-2011.csv
├── Indeks-Standar-Pencemar-Udara-di-Provinsi-DKI-Jakarta-Bulan-April-Tahun-2011.csv
├── Indeks-Standar-Pencemar-Udara-di-Provinsi-DKI-Jakarta-Bulan-Desember-Tahun-2011.csv
├── Indeks-Standar-Pencemar-Udara-di-Provinsi-DKI-Jakarta-Bulan-Februari-Tahun-2011.csv
├── Indeks-Standar-Pencemar-Udara-di-Provinsi-DKI-Jakarta-Bulan-Januari-Tahun-2011.csv
├── Indeks-Standar-Pencemar-Udara-di-Provinsi-DKI-Jakarta-Bulan-Juli-Tahun-2011.csv
├── Indeks-Standar-Pencemar-Udara-di-Provinsi-DKI-Jakarta-Bulan-Juni-Tahun-2011.csv
├── Indeks-Standar-Pencemar-Udara-di-Provinsi-DKI-Jakarta-Bulan-Maret-Tahun-2011.csv
├── Indeks-Standar-Pencemar-Udara-di-Provinsi-DKI-Jakarta-Bulan-Mei-Tahun-2011.csv
├── Indeks-Standar-Pencemar-Udara-di-Provinsi-DKI-Jakarta-Bulan-November-Tahun-2011.csv
├── Indeks-Standar-Pencemar-Udara-di-Provinsi-DKI-Jakarta-Bulan-Oktober-Tahun-2011.csv
├── Indeks-Standar-Pencemar-Udara-di-Provinsi-DKI-Jakarta-Bulan-September-Tahun-2011.csv
├── Indeks-Standar-Pencemar-Udara-di-SPKU-Bulan-Agustus-Tahun-2011.csv
├── Indeks-Standar-Pencemar-Udara-di-SPKU-Bulan-April-Tahun-2011.csv
├── Indeks-Standar-Pencemar-Udara-di-SPKU-Bulan-Desember-Tahun-2011.csv
├── Indeks-Standar-Pencemar-Udara-di-SPKU-Bulan-Februari-Tahun-2011.csv
├── Indeks-Standar-Pencemar-Udara-di-SPKU-Bulan-Januari-Tahun-2011.csv
├── Indeks-Standar-Pencemar-Udara-di-SPKU-Bulan-Juli-Tahun-2011.csv
├── Indeks-Standar-Pencemar-Udara-di-SPKU-Bulan-Juni-Tahun-2011.csv
├── Indeks-Standar-Pencemar-Udara-di-SPKU-Bulan-Maret-Tahun-2011.csv
├── Indeks-Standar-Pencemar-Udara-di-SPKU-Bulan-Mei-Tahun-2011.csv
├── Indeks-Standar-Pencemar-Udara-di-SPKU-Bulan-November-Tahun-2011.csv
├── Indeks-Standar-Pencemar-Udara-di-SPKU-Bulan-Oktober-Tahun-2011.csv
└── Indeks-Standar-Pencemar-Udara-di-SPKU-Bulan-September-Tahun-2011.csv
indeks-standar-pencemaran-udara-ispu-tahun-2012
├── Indeks-Standar-Pencemar-Udara-di-Provinsi-DKI-Jakarta-Bulan-Agustus-Tahun-2012.csv
├── Indeks-Standar-Pencemar-Udara-di-Provinsi-DKI-Jakarta-Bulan-April-Tahun-2012.csv
├── Indeks-Standar-Pencemar-Udara-di-Provinsi-DKI-Jakarta-Bulan-Desember-Tahun-2012.csv
├── Indeks-Standar-Pencemar-Udara-di-Provinsi-DKI-Jakarta-Bulan-Februari-Tahun-2012.csv
├── Indeks-Standar-Pencemar-Udara-di-Provinsi-DKI-Jakarta-Bulan-Januari-Tahun-2012.csv
├── Indeks-Standar-Pencemar-Udara-di-Provinsi-DKI-Jakarta-Bulan-Juli-Tahun-2012.csv
├── Indeks-Standar-Pencemar-Udara-di-Provinsi-DKI-Jakarta-Bulan-Juni-Tahun-2012.csv
├── Indeks-Standar-Pencemar-Udara-di-Provinsi-DKI-Jakarta-Bulan-Maret-Tahun-2012.csv
├── Indeks-Standar-Pencemar-Udara-di-Provinsi-DKI-Jakarta-Bulan-Mei-Tahun-2012.csv
├── Indeks-Standar-Pencemar-Udara-di-Provinsi-DKI-Jakarta-Bulan-November-Tahun-2012.csv
├── Indeks-Standar-Pencemar-Udara-di-Provinsi-DKI-Jakarta-Bulan-Oktober-Tahun-2012.csv
├── Indeks-Standar-Pencemar-Udara-di-Provinsi-DKI-Jakarta-Bulan-September-Tahun-2012.csv
├── Indeks-Standar-Pencemar-Udara-di-SPKU-Bulan-Agustus-Tahun-2012.csv
├── Indeks-Standar-Pencemar-Udara-di-SPKU-Bulan-April-Tahun-2012.csv
├── Indeks-Standar-Pencemar-Udara-di-SPKU-Bulan-Desember-Tahun-2012.csv
├── Indeks-Standar-Pencemar-Udara-di-SPKU-Bulan-Februari-Tahun-2012.csv
├── Indeks-Standar-Pencemar-Udara-di-SPKU-Bulan-Januari-Tahun-2012.csv
├── Indeks-Standar-Pencemar-Udara-di-SPKU-Bulan-Juli-Tahun-2012.csv
├── Indeks-Standar-Pencemar-Udara-di-SPKU-Bulan-Juni-Tahun-2012.csv
├── Indeks-Standar-Pencemar-Udara-di-SPKU-Bulan-Maret-Tahun-2012.csv
├── Indeks-Standar-Pencemar-Udara-di-SPKU-Bulan-Mei-Tahun-2012.csv
├── Indeks-Standar-Pencemar-Udara-di-SPKU-Bulan-November-Tahun-2012.csv
├── Indeks-Standar-Pencemar-Udara-di-SPKU-Bulan-Oktober-Tahun-2012.csv
└── Indeks-Standar-Pencemar-Udara-di-SPKU-Bulan-September-Tahun-2012.csv
indeks-standar-pencemaran-udara-ispu-tahun-2013
├── Indeks-Standar-Pencemar-Udara-di-Provinsi-DKI-Jakarta-Bulan-Agustus-Tahun-2013.csv
├── Indeks-Standar-Pencemar-Udara-di-Provinsi-DKI-Jakarta-Bulan-April-Tahun-2013.csv
├── Indeks-Standar-Pencemar-Udara-di-Provinsi-DKI-Jakarta-Bulan-Desember-Tahun-2013.csv
├── Indeks-Standar-Pencemar-Udara-di-Provinsi-DKI-Jakarta-Bulan-Februari-Tahun-2013.csv
├── Indeks-Standar-Pencemar-Udara-di-Provinsi-DKI-Jakarta-Bulan-Januari-Tahun-2013.csv
├── Indeks-Standar-Pencemar-Udara-di-Provinsi-DKI-Jakarta-Bulan-Juli-Tahun-2013.csv
├── Indeks-Standar-Pencemar-Udara-di-Provinsi-DKI-Jakarta-Bulan-Juni-Tahun-2013.csv
├── Indeks-Standar-Pencemar-Udara-di-Provinsi-DKI-Jakarta-Bulan-Maret-Tahun-2013.csv
├── Indeks-Standar-Pencemar-Udara-di-Provinsi-DKI-Jakarta-Bulan-Mei-Tahun-2013.csv
├── Indeks-Standar-Pencemar-Udara-di-Provinsi-DKI-Jakarta-Bulan-November-Tahun-2013.csv
├── Indeks-Standar-Pencemar-Udara-di-Provinsi-DKI-Jakarta-Bulan-Oktober-Tahun-2013.csv
├── Indeks-Standar-Pencemar-Udara-di-Provinsi-DKI-Jakarta-Bulan-September-Tahun-2013.csv
├── Indeks-Standar-Pencemar-Udara-di-SPKU-Bulan-Agustus-Tahun-2013.csv
├── Indeks-Standar-Pencemar-Udara-di-SPKU-Bulan-April-Tahun-2013.csv
├── Indeks-Standar-Pencemar-Udara-di-SPKU-Bulan-Desember-Tahun-2013.csv
├── Indeks-Standar-Pencemar-Udara-di-SPKU-Bulan-Februari-Tahun-2013.csv
├── Indeks-Standar-Pencemar-Udara-di-SPKU-Bulan-Januari-Tahun-2013.csv
├── Indeks-Standar-Pencemar-Udara-di-SPKU-Bulan-Juli-Tahun-2013.csv
├── Indeks-Standar-Pencemar-Udara-di-SPKU-Bulan-Juni-Tahun-2013.csv
├── Indeks-Standar-Pencemar-Udara-di-SPKU-Bulan-Maret-Tahun-2013.csv
├── Indeks-Standar-Pencemar-Udara-di-SPKU-Bulan-Mei-Tahun-2013.csv
├── Indeks-Standar-Pencemar-Udara-di-SPKU-Bulan-November-Tahun-2013.csv
├── Indeks-Standar-Pencemar-Udara-di-SPKU-Bulan-Oktober-Tahun-2013.csv
└── Indeks-Standar-Pencemar-Udara-di-SPKU-Bulan-September-Tahun-2013.csv

0 directories, 72 files