今天完成了python爬虫作业,但并不是一帆风顺,在写的过程中还是遇到了很多问题:
#基本问题
- 关于包的引入,python的确是个非常灵活的语言,主要体现在他强大的包上,要实现某个功能,基本上调用几个包就能实现一些用传统语言编写很麻烦的功能,非常方便。
- 关于python的编码,我用的是pycharm,感觉编码方式的调整很奇怪,我用utf-8竟然识别不了中文,希望大佬指点,个人也没去深究,因为已经有了一些解决方案,在文件的第一句加入# -- coding: yourcode --,就可以改变这个文件的编码方式
- 在coding过程中,最后做词云分析和数据可视化展示的时候,碰到了一些常见的问题,一开始是导入wordcloud包不成功,因为我是在pycharm中的终端里输入的命令,我点自动提示里的install也没用,下不了,最后我直接打开windows的cmd,输入pip install wordcloud,没想到直接配置好了,速度还贼快,惊喜,而且还给我自动配置了其他配套的模块,属实惊喜
- 词云分析和可视化展示的第二个问题是字体的问题,因为wordcloud词云分析默认字体是不支持中文的,得自己去找中文字体,不过还好我们电脑本身就有支持中文的字体,名称是simhei.ttf,直接win+r,然后输入fonts,然后找到这个字体,复制他的完整路径即可,不然输出的图片上没有文字,只有小框框,当然你也可以自己去找其他支持中文的字体,我只是为了偷懒而已
- 成果图,一个小作业而已,没细搞
下面展示一些源代码:
爬取相关链接:
// bug.py
// An highlighted block
# -*- coding: gbk -*-
import requests
import re
from urllib.parse import quote
from bs4 import BeautifulSoup
#爬取各大城市本地宝链接
def getRes(city_url_list):
#对网页发送请求
url = "http://m.bendibao.com/city.php"
html = requests.get(url = url)
html.encoding = 'gbk2312'
soup = BeautifulSoup(html.text,"html.parser")
soup = soup.find_all("a")
city_all_list = {}
#首先爬取所有城市的链接,保存到字典city_all_list中
for i in soup:
if i.has_attr('href'):
city_all_list[i.text] = i["href"]
extraStr = ['移动版','电脑版','意见建议']
#保存字典里所有城市及链接到txt
file = open("AllCIties.txt","w+")
for i in city_all_list.keys():
s = str(i) + " " + str(city_all_list[i])
if (str(i) < 'A' or str(i) > 'Z' and str(i) not in extraStr):
file.write(s+'\n')
#关闭文件
file.close()
#一线城市列表
city_name_list = ["北京","上海","广州",
"成都","杭州","重庆","西安","苏州",
"武汉","南京","天津","郑州","长沙",
"东莞","佛山","青岛","沈阳"]
#只保留各大城市url
for city in city_name_list:
city_url_list.append(city_all_list[city])
print("人才落户各大城市链接:")
for city in city_url_list:
print(city)
saveFile("CitiesList.txt",city_url_list)
#爬取各城市本地宝搜索链接
def query(city_url_list):
#存放搜索链接
query_url_list = []
n = 0
#分别对各城市的本地宝链接进行请求,以获取搜索链接
print("各城市本地宝搜索url:")
for i in city_url_list:
html = requests.get(url = i)
soup = BeautifulSoup(html.text,"html.parser")
soup = soup.select(".search")
queryKey = quote("人才落户最新")
query = soup[0]["href"]
#拼接搜索关键词
query_url = query.split("?")[0] + "?q="+ queryKey + "&click=1&" + query.split("?")[1] + "&nsid="
query_url_list.append(query_url + '\n')
print(query_url_list[n])
n += 1
saveFile("Cities_search_list.txt",query_url_list)
return query_url_list
#获取详情页链接
def title(query_url_list):
#各城市人才落户政策文章链接列表
title_url_list = []
n = 0
#通过之前拼接的搜索url来爬取各地城市人才落户最新文章
for i in query_url_list:
html = requests.get(url = i)
soup = BeautifulSoup(html.text,"html.parser")
#匹配时加入了属性
soup = soup.select('.c-title a[cpos="title"]')
titleurl = soup[0]["href"]
title_url_list.append(titleurl + '\n')
print(title_url_list[n])
n += 1
saveFile("TitleUrlList.txt",title_url_list)
#保存文件
def saveFile(filename,text):
f = open(filename, 'w',encoding = 'utf-8')
for t in text:
if len(t) > 0:
f.writelines(t + "\n")
f.close()
def main():
city_url_list = [] # 最终所有一线城市落户链列表
getRes(city_url_list)
query_url_list = query(city_url_list)
title(query_url_list)
main()
将政策具体内容爬取到本地txt文件,并进行数据清洗
//writting.py
// An highlighted block
from bs4 import BeautifulSoup
import requests
page = requests.get(url = 'http://wh.bendibao.com/live/202078/113158.shtm')
page.encoding = 'GBK2312'
soup = BeautifulSoup(page.text,'html.parser')
fp = open('./武汉人才引进政策.txt','a',encoding='utf-8')
result = soup.find_all(attrs={'class':'title daoyu'})
result = soup.select('div > h1 > strong')
fp.writelines(result[0].text+'\n')
result = soup.find_all(class_='time')
fp.writelines(result[0].text+'\n')
result = soup.select('.content')
soup = BeautifulSoup(str(result[0]),'html.parser')
i = soup.find('p')
fp.writelines(i.text+'\n')
for i in soup.p.next_siblings:
if i.name == 'div':
break
fp.writelines(i.text+'\n')
s = i.find('a')
if s != None:
fp.writelines(s['href']+'\n')
fp.close()
词云展示 DataShow.py
。
// A code block
var foo = 'bar';
// An highlighted block
import jieba
from wordcloud import WordCloud
import matplotlib.pyplot as plt
import jieba.analyse
import re
#读取爬虫保存下载的数据
file_text = open('武汉人才引进政策.txt', 'r',encoding='utf-8').read()
#使用jieba来处理剪切我们爬取文本内容
cut_text = jieba.lcut(file_text)
#以空格分隔cut_text
df = ' '.join(cut_text)
#提取关键词
tags = jieba.analyse.extract_tags(df, topK=50)
#关键词结果
result = ' '.join(tags)
#使用词云进行数据可视化
wc_cloud = WordCloud(
font_path='C:\Windows\Fonts\simhei.ttf', #字体的路径,使用支持中文的simfei.tff字体
background_color='white', #背景颜色
width=1200,
height=600,
max_font_size=150, #字体的大小
min_font_size=30, #字体的大小
max_words=10000
)
#生成词云
wc_cloud.generate(result)
wc_cloud.to_file('result.png') #图片保存
#图片展示
plt.figure('result_img') #图片显示的名字
plt.title('wuhan')
plt.imshow(wc_cloud)
plt.axis('off')
plt.show()