Python Webクローラー研究ノート(10):データストレージ

1.テキストストレージ

import requests
from pyquery import PyQuery as pq
 
url = 'https://www.zhihu.com/explore'
headers = {
    
    
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'
}
html = requests.get(url, headers=headers).text
doc = pq(html)
items = doc('.ExploreCollectionCard-contentItem').items()
for item in items:
    question = item.find('a').text()
    answer = pq(item.find('.ExploreCollectionCard-contentExcerpt').html()).text()
    file = open('explore.txt', 'a', encoding='utf-8')
    file.write('\n'.join([question, answer]))
    file.write('\n' + '=' * 50 + '\n')
    file.close()

ここで、open()メソッドの最初のパラメーターは保存するターゲットファイルの名前であり、2番目のパラメーターはaです。これは、追加してテキストに書き込むことを意味します。

リクエストを使用してZhihuの「検出」ページを抽出し、次にホットトピックの質問、回答者、回答の全文を抽出し、Pythonが提供するopen()メソッドを使用してテキストファイルを開き、ファイル操作オブジェクトを取得し、ここfile値を割り当ててからfileオブジェクトのwrite()メソッドは、抽出されたコンテンツをファイルに書き込み、最後にclose()メソッドを呼び出してオブジェクトを閉じます。これにより、キャプチャされたコンテンツをテキストに正常に書き込むことができます。

オープンメソッド

ファイルを開く方法は他にもいくつかあります。
ここに写真の説明を挿入

簡略化された書き込み

with as文法を使用します。で、with制御ブロックの終わり、ファイルが自動的に呼び出す必要はありませんので、閉じられているclose()方法は。この保存方法は、次のように省略できます。

with open('explore.txt', 'a', encoding='utf-8') as file:
    file.write('\n'.join([question, answer]))
    file.write('\n' + '=' * 50 + '\n')

保存時に元のテキストをクリアしたい場合は、2番目のパラメーターをwに書き換えることができます。コードは次のとおりです。

with open('explore.txt', 'w', encoding='utf-8') as file:
    file.write('\n'.join([question, author, answer]))
    file.write('\n' + '=' * 50 + '\n')

2.JSONファイルストレージ

JavaScript言語では、すべてがオブジェクトです。したがって、サポートされているタイプは、文字列、数値、オブジェクト、配列など、JSONで表すことができます。

オブジェクト

JavaScriptでは中括弧{}で囲まれ、そのデータ構造は{key1:value1、key2:value2、…}キーと値のペア構造です。オブジェクト指向の言語では、キーはオブジェクトの属性であり、値は対応する値です。キー名は、整数と文字列で表すことができます。値のタイプは任意のタイプにすることができます。

JSONオブジェクトは次のように記述できます。

[{
    
    
    "name": "Bob",
    "gender": "male",
    "birthday": "1992-10-18"
}, {
    
    
     "name": "Selina",
    "gender": "female",
    "birthday": "1995-10-18"
}]
[{'birthday': '1992-10-18', 'gender': 'male', 'name': 'Bob'},
 {'birthday': '1995-10-18', 'gender': 'female', 'name': 'Selina'}]

角括弧で囲まれているのはリストタイプと同じです。リスト内の各要素はどのタイプでもかまいません。この例では、中括弧で囲まれた辞書タイプです。

JSONは、上記の2つの形式で自由に組み合わせることができ、無制限にネストでき、明確な構造を持ち、データ交換の優れた方法です。

2.1JOSNを読む

ライブラリloads()メソッドを呼び出してJSONテキスト文字列をJSONオブジェクトにdumps()変換したり、メソッドを介してJSONオブジェクトをテキスト文字列に変換したりできます。

import json
 
str = '''
[{
    "name": "Bob",
    "gender": "male",
    "birthday": "1992-10-18"
}, {
    "name": "Selina",
    "gender": "female",
    "birthday": "1995-10-18"
}]
'''
print(type(str))
data = json.loads(str)
print(data)
print(type(data))
<class 'str'>
[{'name': 'Bob', 'gender': 'male', 'birthday': '1992-10-18'}, {'name': 'Selina', 'gender': 'female', 'birthday': '1995-10-18'}]
<class 'list'>
with open('data.json', 'w') as f:
    f.write(str)

このloads()メソッド、文字列をJSONオブジェクト変換するためにここで使用されます。最外層はブラケットであるため、最終的なタイプはリストタイプです。

このようにして、インデックスを使用して対応するコンテンツを取得できます。たとえば、最初の要素のname属性を取得する場合は、次の方法を使用できます。

data[0]['name']
data[0].get('name')
'Bob'

2つのメソッドで得られた結果は同じです。get()メソッドを使用することをお勧めします。これにより、キー名が存在しない場合、エラーは報告されず、Noneが返されます。さらに、get()メソッドは2番目のパラメーター(つまり、デフォルト値)を渡すこともできます。例は次のとおりです。

print(data[0].get('age'))
data[0].get('age', 25)

None
25

ここでは、年齢を取得しようとします。実際、キー名は元の辞書に存在せず、デフォルトでNoneを返します。2番目のパラメーター(つまり、デフォルト値)が渡された場合、デフォルト値が存在しない場合はデフォルト値が返されます。

JSONデータは、一重引用符ではなく、二重引用符で囲む必要があることに注意してください。たとえば、次の形式で表現すると、エラーが発生します。

import json
 
str = '''
[{
    'name': 'Bob',
    'gender': 'male',
    'birthday': '1992-10-18'
}]
'''
data = json.loads(str)
json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 3 column 5 (char 8)

JSON文字列を表すには、必ず二重引用符を使用してください。そうしないと、loads()メソッドの解析に失敗します。

たとえば、JSONテキストからコンテンツを読み取る場合、コンテンツが定義したばかりのJSON文字列であるdata.textファイルを次に示します。最初にテキストファイルのコンテンツを読み取り、次にloads()メソッドを使用して変換できます。

import json

with open('data.json') as file:
    str = file.read()
    data = json.loads(str)
    print(data)
[{'name': 'Bob', 'gender': 'male', 'birthday': '1992-10-18'}, {'name': 'Selina', 'gender': 'female', 'birthday': '1995-10-18'}]

2.2出力JSON

このdumps()メソッドを呼び出して、JSONオブジェクトを文字列に変換できます。

import json

data = [{
    
    
    'name': 'Bob',
    'gender': 'male',
    'birthday': '1992-10-18'
}]
with open('data.json', 'w') as f:
    f.write(json.dumps(data))

このdumps()メソッドを使用して、JSONオブジェクトを文字列に変換してwrite()から、fileメソッドを呼び出してテキストを書き込むことができます。

JSON形式を保存する場合はindent、インデントされた文字の数を表す別のパラメーターを追加できます

 with open('data.json', 'w') as file:
    file.write(json.dumps(data, indent=2))

JSONに中国語の文字が含まれている場合、中国語の文字はUnicode文字になります。

import json
 
data = [{
    
    
    'name': '王伟',
    'gender': '男',
    'birthday': '1992-10-18'
}]
with open('data.json', 'w') as file:
    file.write(json.dumps(data, indent=2))

中国語を出力するには、パラメータをensure_asciiとしてFalse指定し、ファイル出力のエンコーディングも指定する必要があります。

with open('data.json', 'w', encoding='utf-8') as file:
    file.write(json.dumps(data, indent=2, ensure_ascii=False))

3.CSVファイルストレージ

CSV、フルネームはComma-Separated Values、中国語はcomma-separatedvaluesまたはcharacter-separatedvaluesと呼ぶことができ、そのファイルは表形式のデータをプレーンテキストで保存します。ファイルは文字のシーケンスであり、ある種の新行文字で区切られた任意の数のレコードで構成できます。各レコードはフィールドで構成されています。フィールド間の区切り文字は他の文字または文字列です。最も一般的なものはコンマまたはタブです。ただし、すべてのレコードにはまったく同じフィールドシーケンスがあります。これは、構造化テーブルのプレーンテキスト形式に相当します。したがって、CSVでデータを保存する方が便利な場合があります。

3.1書き込み

import csv
 
with open('data.csv', 'w') as csvfile:
    writer = csv.writer(csvfile)
    writer.writerow(['id', 'name', 'age'])
    writer.writerow(['10001', 'Mike', 20])
    writer.writerow(['10002', 'Bob', 22])
    writer.writerow(['10003', 'Jordan', 21])

まず、data.csvファイルを開き、オープンモードをw(つまり書き込み)として指定し、ファイルハンドルを取得してからcsvlibrarywriter()メソッドを呼び出して書き込みオブジェクトを初期化し、ハンドルwriterow()を渡しメソッドを呼び出して各行のデータを渡します。完全な書き込み。

列間の区切り文字を変更する場合は、delimiterパラメーターを渡すことができます。コードは次のとおりです。

import csv
 
with open('data.csv', 'w') as csvfile:
    writer = csv.writer(csvfile, delimiter=' ')
    writer.writerow(['id', 'name', 'age'])
    writer.writerow(['10001', 'Mike', 20])
    writer.writerow(['10002', 'Bob', 22])
    writer.writerow(['10003', 'Jordan', 21])

writerows()メソッドを呼び出して、同時に複数の行を書き込むこともできます。この場合、パラメーターは2次元リストである必要があります(例:

import csv
 
with open('data.csv', 'w') as csvfile:
    writer = csv.writer(csvfile)
    writer.writerow(['id', 'name', 'age'])
    writer.writerows([['10001', 'Mike', 20], ['10002', 'Bob', 22], ['10003', 'Jordan', 21]])

辞書の書き込み方法もcsvライブラリで提供されています。例は次のとおりです。

import csv
 
with open('data.csv', 'w', newline='') as csvfile:
    fieldnames = ['id', 'name', 'age']
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
    writer.writeheader()
    writer.writerow({
    
    'id': '10001', 'name': 'Mike', 'age': 20})
    writer.writerow({
    
    'id': '10002', 'name': 'Bob', 'age': 22})
    writer.writerow({
    
    'id': '10003', 'name': 'Jordan', 'age': 21})

中国のコンテンツを書きたい場合、文字エンコードの問題が発生する可能性があります。このとき、open()パラメーターのエンコード形式を指定する必要があります。

import csv
 
with open('data.csv', 'a', newline='', encoding='utf-8') as csvfile:
    fieldnames = ['id', 'name', 'age']
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
    writer.writerow({
    
    'id': '10005', 'name': '王伟', 'age': 22})

3.2読む

csvライブラリを使用してCSVファイルを読み取ることもできます。

import csv
 
with open('data.csv', 'r', encoding='utf-8') as csvfile:
    reader = csv.reader(csvfile)
    for row in reader:
        print(row)
['id', 'name', 'age']
['10001', 'Mike', '20']
['10002', 'Bob', '22']
['10003', 'Jordan', '21']
['10005', '王伟', '22']

パンダを使用する場合は、read_csv()メソッドを使用してCSVからデータを読み取ることができます(例:)。

import pandas  as pd
 
df = pd.read_csv('data.csv')
print(df)
      id    name  age
0  10001    Mike   20
1  10002     Bob   22
2  10003  Jordan   21
3  10005      王伟   22

おすすめ

転載: blog.csdn.net/qq_43328040/article/details/108843876