python
@ljr
初心:寒假在家看小说,看着看着想自己写,然后申了几次没过,打算把榜单文章拿来好好分析一下,做个高大上的词云看看方向什么的。
但我不会爬虫,只听说过,就上网搜别人的代码,但是别人的代码不满足我的需求,我看不懂也改不了。
凭着一口我也是程序人的志气(主要恰好学了python),自己去搜了怎么写爬虫,把视频看了一遍,过了下大概思路,然后看第二遍,注意一些细节,跟着一步一步地做自己的(主要是用他的思路和跟着写一点语句),最后就把晋江上我需要的数据搞出来了。(默默夸一句,beautifulSoup真真真好用)
总目录
思路,看懂学习视频,自己用那样的思路去解自己想要提取信息的网站。
我也遇到很多问题,查了很多资料,看得头都要秃了,但最后做出来的成就感真的很大。
爬虫的学习视频链接如下:
https://www.bilibili.com/video/BV12E411A7ZQ
老师讲得很清晰很有条理!!(声音很好听,就是没有看到脸。)
代码
# -*- codeding = utf-8 -*-
# @Time : 2021/1/22 14:12
# @Author : ljr
# @File : lx1.py
# @Software : PyCharm
#爬取晋江文学城排行榜前一百的书籍名字,链接,字数
import urllib
import urllib.request
from bs4 import BeautifulSoup
import re
import xlwt
import sqlite3
def main():
baseurl = "http://www.jjwxc.net/bookbase.php?fbsj12=12&ycx1=1&xx1=1&xx2=2&page="
# 1.爬取网页
datalist = getData(baseurl)
print(len(datalist))
savepath = ".\\晋江小说.xls"
# dbpath = "book.db"
# 3.保存数据
saveData(savepath,datalist)
# saveDataDb(datalist, dbpath)
#先准备的提取信息内容的正则表达式
findName = re.compile(r'">(.*?)',re.U)
findLink = re.compile(r')
findSize = re.compile(r'(\d+) ')
# 1.爬取网页(完成)
def getData(baseurl):
datalist = []
for i in range(1,4): #搜索结果的页数
url = baseurl + str(i)
html = askURL(url)
# 2.逐一解析
soup = BeautifulSoup(html, "html.parser")
i = 0
for item in soup.findAll('tr'):
data = [] # 保存一本书的所有信息
item = str(item)
# 提取文名
Name = re.findall(findName, item)
# 提取文章链接
Link = re.findall(findLink, item)
# 提取字数
Size = re.findall(findSize, item)
if i:
data.append(Name[1])
Link[1]='http://www.jjwxc.net/' + Link[1]
data.append(Link[1])
data.append(Size[0])
datalist.append(data)
i = 1
return datalist
# 2.得到指定一个URL的网页的内容
def askURL(url):
head = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36 Edg/87.0.664.75"
}
request = urllib.request.Request(url,headers=head)
html = ""
try:
response = urllib.request.urlopen(request)
html = response.read().decode('GBK')
# html = response.read()
# buff = BytesIO(html)
# f = gzip.GzipFile(fileobj=buff)
# html = f.read().decode("GBK")
#这是之前解不开编码时尝试的其它方法
except urllib.error.URLError as e:
if hasattr(e,"code"):
print(e.code)
if hasattr(e,"reason"):
print(e.reason)
return html
# 3.保存数据
# 保存到文件中
def saveData(savepath,datalist):
workbook = xlwt.Workbook(encoding='utf-8',style_compression=0)
worksheet = workbook.add_sheet('晋江1', cell_overwrite_ok=True)
col = ("书名","链接","字数")
for i in range(0,3):
worksheet.write(0,i,col[i])
for i in range(0,len(datalist)):
data = datalist[i]
for j in range(0,len(data)):
worksheet.write(i+1,j,data[j])
workbook.save(savepath)
'''
# 保存到数据库中
def saveDataDb(datalist, dbpath):
init_db(dbpath)
conn = sqlite3.connect(dbpath)
cur = conn.cursor()
for data in datalist:
for index in range(len(data)):
if index != len(data)-1:
data[index] = '"' + data[index] + '"'
sql = "insert into book300(name,link,size) values(%s)"%",".join(data)
print(sql)
cur.execute(sql)
conn.commit()
cur.close()
conn.close()
# 创建数据库
def init_db(dbpath):
conn = sqlite3.connect(dbpath) # 打开或创建一个数据库
c = conn.cursor()
sql = """
create table book300
(name text primary key not null,
link text,
size char(50));"""
c.execute(sql)
conn.commit()
conn.close()
'''
if __name__ == '__main__':
# 调用函数
main()
结果
然后就是做词云分析,统计什么的,我就只想看个词云分析,所以只写了这部分的内容。
代码
# -*- codeding = utf-8 -*-
# @Time : 2021/1/24 19:30
# @Author : ljr
# @File : wcloud.py
# @Software : PyCharm
import sqlite3
import jieba
from matplotlib import pyplot as plt # 绘图,数据可视化
from wordcloud import WordCloud #词云
from PIL import Image # 图片处理
import numpy as np #矩阵运算
con = sqlite3.connect("book.db")
cur = con.cursor()
sql = '''
select name from book300
'''
data = cur.execute(sql)
text = ""
for item in data:
text = text + item[0]
# print(text)
cur.close()
con.close()
#拆词
cut = jieba.cut(text)
string = ' '.join(cut)
#生成遮罩
img = Image.open(r'.\flask\static\images\mask.png')
img_array = np.array(img) #将图片转化为数组
wc = WordCloud(
background_color='white',
mask = img_array,
font_path="SIMYOU"
)
wc.generate_from_text(string)
#绘制图片
fig = plt.figure(1)
plt.imshow(wc)
plt.axis('off') # 是否显示坐标轴
# plt.show() # 显示生成的词云图片
#输出词云图片到文件
plt.savefig(r'.\flask\static\images\word.png')
效果
这个是根据标题中的词语出现频率来做成的,但是大概已经能够确定什么是热标签,写什么题材能够迎合市场,就是穿书,反派,白月光。(我就是确定了这几个哈哈哈,虽然整个寒假什么都没搞出来QAQ。)
基本思路就是先随便找一本书点进链接,然后在这个链接中把自己想要的信息提取出来处理一下。
最后再添加变量,让它遍历你第一步提取出来的文章链接,通过这个链接的变化就可以把每一本书的信息自动提取出来了。(感觉很多地方的模式都是重复的,只是变量上的区别,所以在代码中处理一下变量就可以实现大量系统的重复工作)
目录
代码
# -*- coding = utf-8 -*-
# @Time : 2021/1/25 18:17
# @Author : ljr
# @File : cw.py
# @Software : PyCharm
# 提取文案,存放到excel中,看文案可以快速知道文章大概的情节和人设,爽点萌点等
# 提取标签,做一个词云,掌握市场
import urllib
import urllib.request
from bs4 import BeautifulSoup
import re
import xlwt
import xlrd
from xlutils.copy import copy
import gzip
from io import BytesIO
findCopywrite = re.compile(r'(.*?)', re.U)
#findLable = re.compile(r'(.*?)')
#findSize = re.compile(r'(\d+) ')
def main():
savepath = "晋江小说.xls"
sheetname = "文案"
#1.得到需要爬取的文章页面的列表
data = geturl(savepath,sheetname)
#data = [['ha','o '],['http://www.jjwxc.net/onebook.php?novelid=4790493','http://www.jjwxc.net/onebook.php?novelid=4954901']]
# 2.爬取网页
datalist = getData(data)
print(len(datalist))
# 3.保存数据
saveData(savepath,sheetname, datalist)
print("存储完成")
# saveDataDb(datalist, dbpath)
#1.打开文件得到需要爬取的列表
def geturl(savepath,sheetname):
url = []
name = []
data = []
rb = xlrd.open_workbook('晋江小说.xls', formatting_info=True)
rs = rb.sheet_by_name("晋江1")
for i in range(1, 100):
row_data = rs.row_values(i)
data.append(row_data)
for i in range(len(data)):
name.append(data[i][0])
url.append(data[i][1])
data = [name, url]
return data
# 爬取网页(完成)
def getData(data):
datalist = []
for i in range(len(data[1])):
url=data[1][i]
Lable = []
copywrite = []
print('开始爬取网页:',url)
try:
html = askURL(url)
except (ValueError, OSError) as es:
continue
else:
# 2.逐一解析
soup = BeautifulSoup(html, "html.parser")
for item in soup.find_all('td',class_='readtd'):
item = str(item)
# 提取文案
copywrite.append(re.findall(findCopywrite, item))
# 提取标签
for item in soup.find_all('a',style = "text-decoration:none;color: red;",target = "_blank" ):
Lable.append(item.get_text())
datalist.append([data[0][i],copywrite[0],Lable])
print(datalist)
return datalist
# 得到指定一个URL的网页的内容(完成)
def askURL(url):
head = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36 Edg/87.0.664.75"
}
request = urllib.request.Request(url, headers=head)
html = ""
try:
response = urllib.request.urlopen(request)
# html = response.read().decode('GBK')
html = response.read()
buff = BytesIO(html)
f = gzip.GzipFile(fileobj=buff)
html = f.read().decode("gbk")
except urllib.error.URLError as e:
if hasattr(e, "code"):
print(e.code)
if hasattr(e, "reason"):
print(e.reason)
return html
def saveData(savepath,sheetname, datalist):
# open existing workbook
rb = xlrd.open_workbook(savepath, formatting_info=True)
# make a copy of it
wb = copy(rb)
# add sheet to workbook with existing sheets
worksheet = wb.add_sheet(sheetname)
col = ("书名", "文案","标签")
for i in range(0, 3):
worksheet.write(0, i, col[i])
i = 1
for data in datalist:
worksheet.write(i, 0, data[0])
worksheet.write(i, 1, data[1])
worksheet.write(i, 2, data[2])
i = i + 1
wb.save(savepath)
if __name__ == '__main__':
# 调用函数
main()
想统计下文章中出现的形容词、副词、常用句式什么的,看看那些大火的书有没有 什么共同的规律,人家都用了什么叙事手法,什么梗,什么事件顺序。
下面是继续用jieba拆分整本书的词:
目录:
代码:
# -*- coding = utf-8 -*-
# @Time : 2021/1/25 19:29
# @Author : ljr
# @File : article.py
# @Software : PyCharm
# 用jieba统计处理文章中所有的词语,做词云或者存到excel中都可以
import jieba
import xlwt
import xlrd
from xlutils.copy import copy
def main():
filepath = r'《君子有九思》.txt'
cstring = []
counts = {
}
savepath = r'晋江小说.xls'
sheetname = r'《君子有九思》'
# 1.打开文件
text = readtext(filepath)
# 2.提取词语
cstring = extractwords(text)
# 3.统计频率
counts = wordcount(cstring)
# 4.存放到excel中
saveData(savepath, sheetname, counts)
# 读取文本数据
def readtext(filepath):
fp = open(filepath, 'r', encoding='gbk', errors='ignore')
text = fp.read()
# print(text)
fp.close()
return text
# 用jieba分词进行处理
def extractwords(text):
jieba.load_userdict(r'word.txt')
jieba.add_word('老婆粉')
jieba.add_word('乔瞧')
jieba.add_word('霍希')
jieba.add_word('盛乔')
cstring = jieba.lcut(text)
# string = ' '.join(cut)
# print(cstring)
return cstring
# 统计词频
def wordcount(cstring):
counts = {
} # 通过键值对的形式存储词语及其出现的次数
#
s = open("baidu_stopwords.txt", encoding='utf-8', errors="ignore")
baidu_stop = []
for word in s:
word = word.strip()
baidu_stop.append(word)
#
for word in cstring:
if len(word) == 1: # 单个词语不计算在内
continue
else:
counts[word] = counts.get(word, 0) + 1 # 遍历所有词语,每出现一次其对应的值加 1
items = list(counts.items()) # 将键值对转换成列表
items.sort(key=lambda x: x[1], reverse=True) # 根据词语出现的次数进行从大到小排序
# 去除停用词
for temp in items:
if temp[0] in baidu_stop:
items.remove(temp)
s.close()
return items #返回一个字典
# print(items)
# 将item写入excel
def saveData(savepath,sheetname, datalist):
# open existing workbook
rb = xlrd.open_workbook(savepath, formatting_info=True)
# make a copy of it
wb = copy(rb)
# add sheet to workbook with existing sheets
worksheet = wb.add_sheet(sheetname)
col = ("词语", "次数")
for i in range(0, 2):
worksheet.write(0, i, col[i])
i = 1
for data in datalist:
worksheet.write(i, 0, data[0])
worksheet.write(i, 1, data[1])
i = i + 1
wb.save(savepath)
if __name__ == "__main__":
main()
但是结果,emmm(大声喊:这不是我想要的!!这个统计出来有毛用啊!!!):
我想统计真正用人类思维去理解拆分这个句子,让它是个完整的意思,这个结果明显不符合期待,于是继续搜资料,搜到了机器学习的部分。
于是想学机器学习把这个事情解决了,emmm,然后发现自己的力量太弱小,搞不定机器学习。
哎!(技术小白菜沉重地叹一口气)
其实做了这么多,最后也还没有接近真正能创造价值那一步(就是写出能赚钱的小说),所以计算机/计算机语言都只是工具,要做成真正有效的事需要一环扣一环的努力。