0.需求
需求:在一个【无下一页】的【动态页面】中获取需要用【查看更多】才能获取完整的信息(【爬虫】),并生成【词云】。
要点:在列表页面用请求头里的参数获取所有数据,并根据这个构建新的url,以此获取每一个完整信息。
1.爬虫
1.1库
requests——发http请求
re——通过正则表达式对字符串进⾏匹配
json——处理 JOSN 数据(json是一种数据交换格式)
1.2请求
1.2.0基础
两种请求方法。根据实际请求类型选择。
- get(url, params, args)
- post(url, data, json, args)。data 为要发送到指定 url 的字典、元组列表、字节或文件对象;json 为要发送到指定 url 的 JSON 对象。根据网页请求头里面的内容类型确定。
必要伪装
- 加入请求头,改变User-Agent——从F12→Network→XHR→heads获取
- 代理IP。同一个IP访问过多会被封禁
1.2.1动态页面
问题:无法通过URL获取页面内容。
解释:它是每次加载会不同的页面,点击下一页时上面的URL不变,且用查看源码看不到内容。
方法:获取真实url;利用selenium模拟点击。因后者慢,选择前者。通过F12看真实请求URL,并根据变化规律构建所有真实URL。因为是post请求,所以需要post的参数来构建。
1.2.2异步加载
问题:无法通过URL获取全部内容。
解释:在需要新的数据时,无需全部加载,而是只加载需要的。AJAX(Asynchronous JavaScript and XML)是动态网页用到的东东,可以做到异步更新。本质还是动态页面。
方法:依旧是获取真实URL,根据每次的URL构成找到规律获取全部URL。
1.3获取数据
方法:利用BeautifulSoup对html进行解析(基于css选择器);利用xpath(基于HTML的树结构和节点进行取值);利用JOSN的字段获取,需要返回结果是该格式
1.4清洗数据
问题:得到的内容里面有html的标签。
方法:构建一个模式字符串替换结果中不要的。
regex = re.compile(r'<.*?>')
res_str = regex.sub('', to_replace_str)
2.词云
2.1库
jieba——中文分词库
wordCLoud——词云展示
2.2例子
获取内容→分词→根据参数生成词云
import jieba,numpy
from wordcloud import WordCloud
words = open('a.txt',encoding='utf-8').read()
new_words=' '.join(jieba.cut(words))
# alice_mask=numpy.array(Image.open('./white.jpeg'))
# wordcloud=WordCloud(width=1000, height=860, margin=2, mask=alice_mask, background_color='#FFFFFF',font_path='./song.ttf')
wordcloud=WordCloud(width=1000, height=860, margin=2, background_color='#FFFFFF',font_path='./song.ttf')
wordcloud.generate(new_words)
wordcloud.to_file('aa.jpg')