⽬的:获取到该主页的基本信息,包括⽂章标题、发表时间、访问量、排名等信息 本次爬取数据的代码链接(有两个):
本次需要导⼊模块(也就是Python库)有以下⼏个,可提前安装:
1import requests
2from bs4 import BeautifulSoup
3from tqdm import tqdm
4import jieba
5from wordcloud import WordCloud
6import pandas
7import matplotlib
8import matplotlib.pyplot as plt
第⼀步,我们在getHTMLText( )函数中先伪装成浏览器访问,不然爬取CSDN会爬不到数据;然后就是发送请求,获取⾸页内容。具体代码如下(已规范好,可直接套⽤):
1def getHTMLText(url):
2 user_agent = 'Mozilla/4.0(compatible;MSIE 5.5;Windows NT)'
3 headers = {'User-Agent': user_agent}
有源噪声控制
4 response = (url, headers=headers)
5 home_page = t.decode()
6 # )
7 return home_page
第⼆步,我们要使⽤BeautifulSoup提取⾸页数据,具体代码如下(已规范好,可直接套⽤):
1def getSoup(url):
2 txt = getHTMLText(url)
3 soup = BeautifulSoup(txt, 'html.parser')
4 return soup
第三步,分为两个内容:
第⼀,爬取左栏博主基本信息。博主基本信息包括:名字、原创篇数、周排名、总排名、总访问量、等级,因为原创篇数、周排名、总排名、总访问量、等级在相同的标签下,有相同的class,所以,可以直接使⽤遍历来获取所需的数据,然后定义⼀个列表,最后将这些数据存⼊列表中,具体代码见下:
1def getContent2(soup):
2 contents2 = soup.find('div', {'class': 'aside-box'})
3 global all_word
4 articles2 = []
5
6 name = contents2.find('span', {'class': 'name'})
7 name = name.string
8 str2 = name + ','
9 articles2.append([name])
10 item = contents2.find('div', {'class': 'data-info d-flex item-tiling'})
11 date = 0
12 for date in item.find_all('dl'):
13 date = date['title']
14 str2 += date + ','
15 articles2.append([date])
第⼆,爬取右栏⽂章基本信息。⽂章基本信息包括:⽂章发表时间、访问次数、标题、创作类型,这⾥同样会发现⽂章发表时间、访问次数、标题、创作类型也都在相同的标签下,有相同的class,所以,也可以直接使⽤遍历来获取所需的数据,然后同样定义⼀个列表,将这些数据存⼊列表中,具体代码见下: 1def getContent1(soup):
2 contents1 = soup.find('div', {'class': 'article-list'})
3 global all_word
4 articles1 = []
5 for item in tqdm(contents1.find_all('div', {'class': 'article-item-box csdn-tracking-statistics'}), '采集博主所有⽂章中'):
6 date = item.find('span', {'class': 'date'})
7 date =
8 watch = item.find('span', {'class': 'read-num'})
9 watch =
10 title = item.find('p', {'class': 'content'})
11 title = title.string
12 article_type = item.find('span', {'class': 'article-type type-1 float-none'})
承德市南营子小学13 article_type = article_type.string
14 str1 = title + ',' + article_type + ',' + watch + ',' + date + '\n'
15 file.de('gbk', 'ignore').decode('gbk', 'ignore'))
16 all_word = all_word + title + article_type + watch + date + ' '
17 articles1.append([title, article_type, watch, date])
这⾥,第⼆部分内容相⽐第⼀部分多了⼀些东西,⽐如⽤tqpm对遍历进⾏操作,进⽽能够查看爬取数
据的进度,使运⾏时能够更加清晰地看到爬取进度;此外,我们还会发现,我们会⽤专门的⼀个函数来对'gdk’格式进⾏忽略,避免因为⼀些数据格式的不同导致运⾏的错误。
第四步,创建⼀个CSV⽂件来存储这些数据,分别将左栏和右栏的内容传进CSV⽂件中,并注明表头标题,具体代码见下:
1file = open('D:\\Python⽂件\\blogger-data-last.csv', 'w')
2
3# 左栏内容制成表格导⼊CSV⽂件中
4str2 = '博主昵称,原创篇数,周排名,总排名,总访问量,等级\n'
5file.write(str2)
6soup = getSoup(url)
7getContent2(soup)
8
9# 右栏内容制成表格导⼊CSV⽂件中
10str1 = '\n⽂章标题,⽂章创作类型,访问次数,发表时间\n'
11file.write(str1)
12soup = getSoup(url)
13getContent1(soup)
以上的四个步骤,就可以将该⽹站上所需的数据爬取下来到CSV中。接下来,就是对爬取出来的这些数据绘制成⼏个图表,也称为可视化处理。
图⼀,词云图。计算词出现的频率,若该词出现次数越多,则会在窗⼝上显⽰的就越⼤且越靠中间;否则,会在窗⼝上显⽰在⾓落旁且字体⾮常⼩。那么,如何制出⼀张合格的词云图呢?我们可以先定义⼀个全局变量,然后将想要计算词频的数据全部存进这个全局变量中,再将这个变量中的所有词⽤jieba库将其切割开,最后⽤wordcould库来将这些切割开的数据绘制成⼀张图(记得改⽤中⽂字体),就可以很直观地看出哪些词出现的多,哪些词出现的少了,具体代码见下:
1# 将搜集到的词⽤jieba库分隔开
2word_cut = jieba.lcut(all_word)
3word_cut = " ".join(word_cut)
4
5# 读取数据,绘制成词云图
6word_cloud = WordCloud(font_path="")
7word_cloud = ate(word_cut)
8plt.plot(figsize=(15, 10))
9plt.imshow(word_cloud)
10plt.axis("off")
11plt.show()
运⾏后得出的结果如下图:
图⼆,柱状图。⾸先,我们要确定纵坐标和横坐标,就⽐如这⾥,我想研究其每⽉发表的⽂章数量,所以,把⽉份作为横坐标,把该⽉发表⽂章数量作为纵坐标。接下来,我们的思路就是,先⽤pandas库来获取发布时间列的数据,再将其中的⽉份⽤下标索引抽取出来,整理爬取到的数据中每个⽉份分别出现多少次,这⾥,就可以⽤之前计算词出现次数的那个⽅法来计算,这⾥就不展开详细讨论了,然后将他们存⼊列表中,就可以很好的把图作出来了。具体代码见下:
1lst1 = []
2df = ad_csv("D:\\Python⽂件\\blogger-data-alreadylast.csv", encoding="ANSI")
3for i in range(len(df)):
4 if str(df.iat[i, 3][5:7]) == '10' or str(df.iat[i, 3][5:7]) == '11' or str(df.iat[i, 3][5:7]) == '12':
5 date = int(df.iat[i, 3][5:7])
6 else:
7 date = int(df.iat[i, 3][5:6])
8 lst1.append(date)
9lst1.sort()
10set1 = set(lst1)
11lst2 = list(set1)
12map1 = {}
13for num in lst1:
14 if num in map1:
15 map1[num] += 1
16 else:
17 map1[num] = 1
18map1 = map1.values()
19lst3 = list(map1)
20plt.figure(figsize=(8, 6))
21y1 = lst3
22x = lst2
23plt.bar(x, y1, color="blue", width=0.5)
25plt.xlabel("⽉份")
26plt.ylabel("每⽉发表⽂章数量")
27plt.show()
运⾏后得出的结果如下图:
图三,折线图。⾸先,同样的,我们要确定纵坐标和横坐标,就⽐如这⾥,我想研究每⽉的访问数量,所以,把⽉份作为横坐标,把该⽉访问量作为纵坐标。接下来,我们的思路就是,先⽤pandas库来获取访问次数列的数据将,再将该⽉的每篇⽂章的访问量加起来,每个⽉都循环这样,然后,将他们存⼊列表中,就可以很好的把图作出来,具体的代码见下:
1df = ad_csv("D:\\Python⽂件\\blogger-data-alreadylast.csv", encoding="ANSI")
2y2 = df.访问次数
3lst4 = list(y2)孝子洞理发师
5lst5 = []
6for i in range(len(lst3)):
7 sum = 0
8 for j in range(lst3[i]):
9 sum += lst4[j]
10 del lst4[0:lst3[i]]
小渊优子11 lst5.append(sum)
12
14plt.plot(lst2, lst5, "r", marker='.', ms=10, label="a")
15plt.xlabel("⽉份")
16plt.ylabel("该⽉总访问量")
17plt.legend(loc="upper left")
18for x1, y1 in zip(lst2, lst5):
19 (x1, y1 + 1, str(y1), ha='center', va='bottom', fontsize=20, rotation=0)
20plt.show()
运⾏后得出的结果如下图:
可利霉素片
到此,就能很好的把整个项⽬运⾏出来,这样就可以根据⾃⼰的需要更换⽹址来按⾃⼰的想法爬取数据,其中,上述的代码中也有很多是模板的,也可以根据⾃⼰需要进⾏套⽤等。
邻苯二甲酸酯到这⾥,想要本项⽬完整代码的,可以回到开头说的那个gitee⽹址就可以获取到 。