网页数据的基本类型
类型 | 特点 | 实例 |
---|---|---|
标签数据(传统页面) | 可以直接通过访问标签/类名的方式来获得数据 | 文字、标题 |
JacaScript数据(传统页面) | 浏览器能展示的数据,没有在网页标签中给出,而是在js语法中给出;需要使用re库解析页面数据(正则匹配) | 在js语法中给的网页超链接 |
Json数据(使用AJAX的非传统页面) | 1.无需重新加载整个网页的情况下,能够更新部分网页; AJAX = 异步 JavaScript 和 XML,是创建快速动态网页的技术;2.打开网页,利用“查看网页源代码” “搜索”,找不到需要爬取数据,对应位置为javascript代码,无法利用BeautifulSoup库获取数据 | 新浪微博、Google地图、百度图片、实时播报等等 |
不同类型数据的获取方法
类型 | 获取方法 |
---|---|
标签中能获得的数据 | 先用request.get()获取页面,再用BeautifulSoup解析数据,再用select()方法匹配所需数据 |
一般的图片(在标签中给出图片链接) | 两次请求页面,方法同上,第一次r获取图片链接,第二次获取图片文件request.get()获取图片页面,f.write(html.content)二进制写文件 |
js语法代码数据(如在js语法才给出的超链接) | 1.定义正则匹配规则; 2.re库解析数据 |
Json数据 | 1.通过抓包/抓包工具,获取JSON数据(利用html_text.find(’ ')定位);2.JSON库解析数据 |
利用Json库解析页面数据
-
抓包
1.1 打开需要爬取的页面 > “检查”页面 >”network”选项卡
1.2 刷新页面 > 查找”preview”中对应的JSON数据
1.3 找到“Headers”中的Request URL,即为需要爬取的数据链接 -
由链接获取接口数据
requests.get(url,headers=headers) -
用JSON库获取有效数据
3.1 定位JSON数据:html_text.find(’’)
3.2 装入JSON数据:json.loads(html_text[start:-1])
3.3 利用键访问数据:json_data[‘Data’][‘Item’]
Json库解析页面数据实例,爬取股票的名称和交易信息(前一日收盘价和当天价格)
一、导入包
包 | 作用 |
---|---|
request | 获取页面 |
json | 解析页面数据 |
csv | 保存数据到文件 |
二、抓包
-
打开需要爬取的页面 > “检查”页面 >”network”选项卡
-
刷新页面 > 查找”preview”中对应的JSON数据
-
找到“Headers”中的Request URL,即为需要爬取的数据链接
三、由链接获取接口数据
- 填写headers
- 根据步骤二获得的链接,爬取页面数据
四、用Json库获得有效数据
- 定位JSON数据:html_text.find()
- 装入JSON数据:json.loads()
- 利用键访问数据
五、保存到csv文件
- 新建一个文件夹
- 以”追加写入“方式打开csv文件,编码格式指定为’utf-8’,防止出现中文乱码
- 在主函数里面,首先写入一行标题
六、爬取多个页面
由于数据分了231个页面放置,需要利用一个for循环来逐个爬取所需信息。观察不同页面url的规律,发现关键的区别在于一段”pn= "。
七。源代码
import requests
import json
import csv
import os
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36 Edg/92.0.902.67'
}
def get_data(url):
html = requests.get(url, headers=headers)
html_text = html.text
start = html_text.find('{"rc"')
json_data = json.loads(html_text[start:-2]) # 字符串数据使用loads()方法装入
my_data = json_data['data']['diff']
'''最新价-f2,昨收-f18,名称-f14,编号-f12,涨跌幅-f3,市盈率-f9'''
with open('股票信息' + '/' + '沪深A股个股行情.csv', 'a', newline='',
encoding='utf-8') as f1: # 用追加的方式写入文件,因为需要使用for循环写入多个页面;将newline指定为空,否则写一行会空一行;编码方式需要指定,否则写入中文会乱码
writer1 = csv.writer(f1)
for data in my_data:
print(data['f14'], data['f12'], data['f2'], data['f18'], data['f3'], data['f9'])
writer1.writerow([data['f14'], data['f12'], data['f2'], data['f18'], data['f3'], data['f9']])
if __name__ == '__main__':
'''新建一个文件夹放置当前文件,把信息写入csv文件,保存到文件夹中'''
filepath = '股票信息'
if not os.path.exists(filepath):
os.mkdir(filepath)
with open('股票信息' + '/' + '沪深A股个股行情.csv', 'a', newline='', encoding='utf-8') as f:
writer = csv.writer(f)
writer.writerow(['股票名称', '股票代码', '最新价', '昨收', '涨跌幅(%)', '动态市盈率'])
for i in range(1, 232):
url = 'http://91.push2.eastmoney.com/api/qt/clist/get?cb=jQuery112404209985357837711_1628862767116&pn={}' \
'&pz=20&po=1&np=1&ut=bd1d9ddb04089700cf9c27f6f7426281&fltt=2&invt=2&fid=f3&fs=m:0+t:6,m:0+t:80,m:1+t:2,' \
'm:1+t:23&fields=f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f12,f13,f14,f15,f16,f17,f18,f20,f21,f23,f24,f25,f22,f11,' \
'f62,f128,f136,f115,f152&_=1628862767117'.format(i)
get_data(url)