爬虫基本知识

网页数据的基本类型

类型特点实例
标签数据(传统页面)可以直接通过访问标签/类名的方式来获得数据文字、标题
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.1 打开需要爬取的页面 > “检查”页面 >”network”选项卡
    1.2 刷新页面 > 查找”preview”中对应的JSON数据
    1.3 找到“Headers”中的Request URL,即为需要爬取的数据链接

  2. 由链接获取接口数据
    requests.get(url,headers=headers)

  3. 用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保存数据到文件
二、抓包
  1. 打开需要爬取的页面 > “检查”页面 >”network”选项卡

  2. 刷新页面 > 查找”preview”中对应的JSON数据
    在这里插入图片描述

  3. 找到“Headers”中的Request URL,即为需要爬取的数据链接
    在这里插入图片描述

三、由链接获取接口数据
  1. 填写headers
    在这里插入图片描述
  2. 根据步骤二获得的链接,爬取页面数据
四、用Json库获得有效数据
  1. 定位JSON数据:html_text.find()
  2. 装入JSON数据:json.loads()
  3. 利用键访问数据
五、保存到csv文件
  1. 新建一个文件夹
  2. 以”追加写入“方式打开csv文件,编码格式指定为’utf-8’,防止出现中文乱码
  3. 在主函数里面,首先写入一行标题
六、爬取多个页面

由于数据分了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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值