介绍
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/圣经爬虫