教你使用python回顾妇联三
2019-01-08 本文已影响3人
underShadow
python爬虫实战
1. 首先对网页进行分析
1.1 找到评论在网页中中的主体位置
1526971421657.png1.2发现评论所在位置
1526971472381.png1.3下一步就是使用简单的爬虫获取一下信息
import requests
# 为了防止发爬虫机制,用 requests 获取源代码
from pyquery import PyQuery as pq
# 用pq解析网页,拿取我们希望得到的元素
url = 'https://movie.douban.com/subject/24773958/reviews?start=20'
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36"
}
def get_html():
# 接下来就是拿着这么多的URL 分别获取评论信息
r = requests.get(url, headers=headers)
r.raise_for_status()
r.encoding = r.apparent_encoding
html = r.text
doc = pq(html)
content = doc('.short-content').text()
print(content)
get_html()
1.3爬取的结果
1526971266315.png1.4发现问题
- 输出结果并不完全,大部分结果在浏览器中通过点击才可以实现
- 分析 NETWORK 注意到以下几个位置
总结一下就是:
- 每一条评论并不是在网页打开就可以完全输出的,所以每条评论预览效果会放在
class= "short-content"
的标签中 - 通过点击展开选项,发现这部分评论会动态输出一部分这部分内容主要在
id="link-report"
中 - 仔细观察不难看出每一条信息实质是通过AJAX技术动态获取的
- AJAX内容保存在json文件中,每一个用户的信息先通过
data-rid="9348147"
当点击展开评论的时候data-rid
的值传到review-content
标签中一个叫data-url="https://movie.douban.com/review/9348147/
2. 重新定向爬虫的URL
2.1前瞻XHR中的信息
import urllib
import requests
from pyquery import PyQuery as pq
return_data = requests.get("https://movie.douban.com/j/review/9357469/full")
doc = pq(return_data.text)
print(doc('p'))
2.2准备工作
为了减少电脑压力先测试处理三个网页的所用用户信息
整理一下思路:
- 获取每个用户发表评论的id号码
data-cid=""
- 利用使用BeautifulSoup获取这写id值
attrs = {"data-cid"}
每获取一个id 就访问下AJAX服务器,把id域地址拼接起来https://movie.douban.com/j/review/ id传过来 /full
1526980295211.png
- 重新整理以上信息,ID在每一个
class='replay'
的标签中,一共有20个,只有reply是唯一的
- 获取每一条 href 然后对字符串切片
2.3 获取用户id并拼接AJAX地址
for item in atab:
href = item.attrs['href']
cut = href[32:39] # 成功输出字符,下一步开始抓取数据
ajax = requests.get("https://movie.douban.com/j/review/" + cut + "/full")
doc = pq(ajax.text)
resule = doc('p').text()
print(resule)
1527000451900.png
2.4文件写入
with open("data.txt", "a+", encoding='utf-8') as f:
for reader in resule:
f.write(reader)
f.close()
1527000565598.png
2.5利用词云生成词的频率分析
2.5.1 设置前景图片
cut_text = " ".join(jieba.cut(comment_text))
d = path.dirname(__file__) # 当前文件文件夹所在目录
color_mask = imread("bgimg.jpg") # 读取背景图片
cloud = WordCloud(
# 设置字体,不指定就会出现乱码
font_path="c:\\WINDOWS\\Fonts\\msyh.ttc",
# font_path=path.join(d,'simsun.ttc'),
# 设置背景色
background_color='white',
# 词云形状
mask=color_mask,
# 允许最大词汇
max_words=4000,
# 最大号字体
max_font_size=60,
width=4960,
height=2556
)
2.5.2利用WorldCloud 生成词云
from wordcloud import WordCloud
import jieba
from os import path
import matplotlib.pyplot as plt
# 绘制词云
def draw_wordcloud():
# 读入一个txt文件
comment_text = open('data.txt', 'r', encoding='utf-8').read()
# 结巴分词,生成字符串,如果不通过分词,无法直接生成正确的中文词云
cut_text = " ".join(jieba.cut(comment_text))
d = path.dirname(__file__) # 当前文件文件夹所在目录
color_mask = imread("bgimg.jpg") # 读取背景图片
cloud = WordCloud(
# 设置字体,不指定就会出现乱码
font_path="c:\\WINDOWS\\Fonts\\msyh.ttc",
# 设置背景色
background_color='white',
# 词云形状
mask=color_mask,
# 允许最大词汇
max_words=4000,
# 最大号字体
max_font_size=60,
width=4960,
height=2556
)
word_cloud = cloud.generate(cut_text) # 产生词云
word_cloud.to_file("pjl_cloud4.jpg") # 保存图片
# 显示词云图片
plt.imshow(word_cloud)
plt.axis('off')
plt.show()
if __name__ == '__main__':
draw_wordcloud()
pjl_cloud4.jpg