例子:这个例子使用pyquery解析库进行解析
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('.explore-tab .feed-item').items()
for item in items:
question = item.find('h2').text()
author = item.find('.author-link-line').text()
answer = pq(item.find('.content').html()).text()
file = open('explore.txt', 'a', encoding='utf-8')
file.write('\n'.join([question, author, answer]))
file.write('\n' + '=' * 50 + '\n')
file.close()
控制文件的简单写法,使用with
在with控制块结束的时候,文件会自动关闭,所以就不需要再调用close()方法:
with open('explore.txt', 'a', encoding='utf-8') as file:
file.write('\n'.join([question, author, answer]))
file.write('\n' + '=' * 50 + '\n')
with open(…) as …
我们可以调用 json 库的 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))
我们使用loads方法后获得了一个数组,我们可以使用data[0]['name']
获取第一个元素里面的name属性,但是!!!推荐使用data[0].get('name')
这种方法,因为这样如果键名不存在不会报错,会返回None。JSON数据需要使用双引号来包围
输出JSON到文本:
import json
data = [{
'name': 'Bob',
'gender': 'male',
'birthday': '1992-10-18'
}]
with open('data.json', 'w') as file:
file.write(json.dumps(data))
这样写入到文本中就是一行长串数据,如果我们想储存成JSON缩进格式,可以加indent参数
file.write(json.dumps(data, indent=2))
如果要输出中文:
file.write(json.dumps(data, indent=2, ensure_ascii=False))
Comma-Separated Values 文件以纯文本形式储存表格数据,字段间的分隔符是其它字符或字符串
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])
这样默认的字段之间是用逗号隔开的,如果我们想修改列与列之间的分隔符,我们可以:writer = csv.writer(csvfile, delimiter=' ')
这就代表分隔符为空格。
如果要一次性写入多行:writer.writerows([['10001', 'Mike', 20], ['10002', 'Bob', 22]]
但是大部分情况下爬虫爬取的数据是字典类型的结构化数据,csv库一样可以做到:
import csv
with open('data.csv', 'w') 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})
读取CSV文件:
可以使用CSV库来读取:
import csv
with open('data.csv', 'r', encoding='utf-8') as csvfile:
reader = csv.reader(csvfile)
for row in reader:
print(row)
这样打印出来的就是一个个列表,代表每一行的数据
但是这样看起来不够直观,所以我们可以使用更好处理数据的库pandas:
import pandas as pd
df = pd.read_csv('data.csv')
print(df)
这种方法比较简便,并且输出的结果也很美观