python数据爬取---爬取文本数据并进行特征提取
1、寻找目标网站并分析结构
我们这次来爬‘百思不得其姐’的内涵段子。
目标网址:
网站结构:每页默认20个段子,要翻页,第2页的网址是2,由此可以推断,该网站是在最后加上数字来区分页面,这样我们可以使用for循环来爬取所有页面的信息。我们可以把目标页面锁定在1-10页。
页面结构:单击鼠标右键选择检查,段子内容保存在一个中
2、编写爬虫进行内容爬取
#导入request库用来请求http import requests #导入BeautifulSoup用来对html进行解析 from bs4 import BeautifulSoup #导入正则表达式用来匹配模式 import re #导入时间库用来设置休眠时间,避免给服务器带来过大负担 import time ##1-爬数据 #1.1创建一个列表来存爬的数据 all_jokes=[] #1.2 指定用户代理信息user agent,建立爬虫 user_agent = Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36 headers = {User-Agent:user_agent} #设置for循环,让爬虫从第1页爬到第10页 for i in range(1,11): #1.3 用requests.get()方法读取网页 content=requests.get(http://www.budejie.com/text/{}.format(i),headers=headers) #1.4 用户BeautifulSoup()方法解析网页 soup = BeautifulSoup(content.text, lxml, from_encoding=utf8) #1.5 提取正文---正文保存在<div class=j-r-list-c-desc>中,find_all文档https://www.cnblogs.com/keye/p/7868059.html #找到正文位置 jokes=soup.find_all(div,class_=j-r-list-c-desc) for joke in jokes: text=joke.a.string #将爬取的正文添加到列表中 all_jokes.append(text) #打印正在爬取的页面 print(正在爬取第{}页.format(i)) #设置每爬一页,休眠2秒 time.sleep(2)
##存数据 #建立一个文件,以写入模式打开,记得设置编码为gb18030,否则会乱码 with open (/Users/Eric/Documents/2019/python/jokes.txt,w,encoding = utf8) as f: for j in all_jokes: #将文本写入 f.write(str(j)) f.write( )
3、解析数据
##读取爬取的数据 #打开文件 file=open(/Users/Eric/Documents/2019/python/jokes.txt,r,encoding = utf8) #读取所有行 lines=file.readlines() #提取出文本中的字符串数据 line=str(lines) ##处理数据 #导入结巴分词 import jieba #使用结巴分词对文本进行分词 line=jieba.cut(line) #在分词中加入空格 x= .join(line) #保存文件 with open (/Users/Eric/Documents/2019/python/cutjokes.txt,w,encoding = utf8) as f: f.write(x) #使用词袋模型对分词进行计数 #导入文本向量化工具 from sklearn.feature_extraction.text import CountVectorizer #引入算法 vect = CountVectorizer() #用CountVectorizer算法拟合文本数据 import pandas as pd df_txt=pd.read_csv(r"/Users/Eric/Documents/2019/python/cutjokes.txt",sep=" ") vect.fit(df_txt) df_txt_vect=vect.vocabulary_ #保持数据 s = str(df_txt_vect) with open (/Users/Eric/Documents/2019/python/df_txt_vect.txt,w,encoding = utf8) as f: f.write(s)