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)
