学习python, 爬取网站,存储json数据在本地,并构建app过程

介绍

1.原因:

市面上的app需调用接口,数据不存在本地,老娘出去看书不方便,便有了写这个APP的想法,使用爬虫爬到本地,使用JSON数据格式存储,主要给大家提供一个思路

学习爬虫写的一个程序,

2.项目难点:

主要难度在于python JSON数据处理和对python语言的不熟悉,数据处理好了就容易很多,前端使用uniapp架构页面

流程:

1. 在百度中搜寻,容易爬取的目标网站

链接就不放出来了,可在源码中查看

2.查看单个详情页结构

相关代码:

    url = str(web_url) + str(row) + '.html'
    html = request(url)
    soup = BeautifulSoup(html, 'lxml')
    # 获取长度
    for span in soup.find_all('ul', class_='l4'):
        page_row = span.find_all('li')
    # 获取值
    page_row2 = []
    for span in soup.find_all('ul', class_='l4'):
        for i in span.find_all('li'):
            a = i.find('a').string
            page_row2.append(a)
    # 创建JSON文件,并写入数据

    data["menu"] = page_row2,

web_url 为 全局存放的网络地址,row为当前函数传入的参数,request()函数是封装了pyon的request请求 ,

ps.一开始陷入了思维僵局,想把爬取好的单一JSON数据存储后读取再存储一遍,后来发现python的json工具不支持那么深层的数据读取,所以最后只存储了一遍

3.查看子目录

 相关代码

    url = str(web_url) + str(row) + '.html'
    html = request(url)
    soup = BeautifulSoup(html, 'lxml')
    # 获取长度
    for span in soup.find_all('ul', class_='l4'):
        page_row = span.find_all('li')
    # 获取值
    page_row2 = []
    for span in soup.find_all('ul', class_='l4'):
        for i in span.find_all('li'):
            a = i.find('a').string
            page_row2.append(a)
    # 存储每个大章的目录数据
    data["menu"] = page_row2,

ps.data在全局定义的,row为当前函数传入的参数

3.主函数运行

    for rows in range(1, 67):
        # 在大章目录爬取目录表计算长度,返回page值,然后循环爬取当且页面值
        page = page_save(rows)
        for pages in range(1, page+1):
            main(rows, pages)

        save(rows)

page_save为第一步,第二部放在main函数里面

def main(row, page):

    url = str(web_url) + str(row) + '_' + str(page) + '.html'
    # print(url)
    html = request(url)

    soup = BeautifulSoup(html, 'lxml')
    # print(html)
    # type = sys.getfilesystemencoding()
    save_to_json(soup, row, page)
    return

save_to_json 这个函数即是详情页面存储的函数,即第二步(当时写急了,有时间改下名称)

4.封装的request方法

def request(url):
    # print(url)
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko Core/1.70.3877.400 '
                      'QQBrowser/10.8.4506.400',
    }
    try:
        response = requests.get(url=url, headers=headers)
        # print(response.status_code)
        if response.status_code == 200:
            return response.text
    except requests.RequestException:
        return None

5.封装的JSON方法

def save(row):

    # print(data)
    global data
    file_name = str(file_url) + \
        str(row) + '.json'

    # 存储方法
    with open(file_name, 'w', encoding='utf-8') as file_obj:
        '''写入json文件'''
        file_obj.write(json.dumps(data, indent=4, ensure_ascii=False))

    data = {}

最后JSON存储完成后,data = {}将当前软件内的data数据清空

最后附上整体代码

# -*-coding:UTF-8-*-
# encoding:gbk
from asyncio import ensure_future
import requests
from bs4 import BeautifulSoup
import sys

import json
# python对于json有ijson插件但是感觉用的不是特别舒服,
# 最后选择用原生的json模块+全局变量方式解决

# 全局定义一个data变量,用来存储每大章的数据
data = {}

# 定义全局存放地址
file_url = "C:/Users/Administrator/Desktop/note/python学习/5th day/json_shengjing"

# 定义全局需爬取的网络地址
web_url = ""


def request(url):
    # print(url)
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko Core/1.70.3877.400 '
                      'QQBrowser/10.8.4506.400',
    }
    try:
        response = requests.get(url=url, headers=headers)
        # print(response.status_code)
        if response.status_code == 200:
            return response.text
    except requests.RequestException:
        return None


def save_to_json(soup, row, page):
    print(page)

    tilte_row = []
    for span in soup.find_all('h3', class_='pt'):
        a = span.string
        tilte_row.append(a)
        # print(tilte_row)

    article_row = soup.find_all('p', class_='l180')

    data["tilteRow"+str(page)] = str(tilte_row)
    data["articleRow"+str(page)] = str(article_row)


def page_save(row):
    # print(page)
    url = str(web_url) + str(row) + '.html'
    html = request(url)
    soup = BeautifulSoup(html, 'lxml')
    # 获取长度
    for span in soup.find_all('ul', class_='l4'):
        page_row = span.find_all('li')
    # 获取值
    page_row2 = []
    for span in soup.find_all('ul', class_='l4'):
        for i in span.find_all('li'):
            a = i.find('a').string
            page_row2.append(a)
    # 创建JSON文件,并写入数据

    data["menu"] = page_row2,

    return len(page_row)


def save(row):

    # print(data)
    global data
    file_name = str(file_url) + \
        str(row) + '.json'

    # 存储方法
    with open(file_name, 'w', encoding='utf-8') as file_obj:
        '''写入json文件'''
        file_obj.write(json.dumps(data, indent=4, ensure_ascii=False))

    data = {}


def main(row, page):

    url = str(web_url) + str(row) + '_' + str(page) + '.html'
    # print(url)
    html = request(url)

    soup = BeautifulSoup(html, 'lxml')
    # print(html)
    # type = sys.getfilesystemencoding()
    save_to_json(soup, row, page)
    return


if __name__ == '__main__':
    # 上面是测试单个数据的
    # for rows in range(1, 2):
    #     page = page_save(rows)
    #     for pages in range(1, 3):
    #         main(rows, pages)
    #     save(rows)

    # 下方是测试多条数据的
    for rows in range(1, 67):
        # 在大章目录爬取目录表计算长度,返回page值,然后循环爬取当且页面值
        page = page_save(rows)
        for pages in range(1, page+1):
            main(rows, pages)

        save(rows)

附上项目地址:jiang/圣经爬虫

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值