今天爬取的是腾讯视频的最新短评(鬼吹灯之黄皮子坟)的评论者、最新短评内容、评论赞;
首先分析一下要爬取的网页
点击更多,看下url是否会变化
由此看出应该是动态加载的
其实刚开始我还看了这些数据是json,还想着用构造url,直接请求的方法去爬,但是看完请求url就放弃了;
这里url有太多的参数不好构造就没有往这方面想了;
下面进入正题,
首先pip安装selenium
下面是代码
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains
import time
import pymongo
# 连接到Mongo
conn = pymongo.MongoClient(host='localhost', port=27017)
# 选择或创建数据库
tencent = conn['tencent']
# 选择或创建数据集合
newsdata = tencent['鬼吹灯之黄皮子坟']
# 把每个评论的数据存入这个字典
comment_one = {}
# 使用Chrome浏览器模拟打开网页,但是要把下载的chromedriver.exe放在python的文件路径下,
#调试好之后换成PhantomJs,速度应该会快一点
driver = webdriver.Chrome()
driver.get("https://v.qq.com/tv/p/topic/gcdzhpzf/index.html")
# 下拉滑动浏览器屏幕,具体下拉多少根据自己实际情况决定
driver.execute_script("window.scrollBy(0,10000)")
time.sleep(8)
driver.execute_script("window.scrollBy(0,6000)")
time.sleep(3)
i = 0
# 这里必须要先切到你要爬取数据的frame下,否则找不到你写的路径
driver.switch_to.frame('commentIframe1')
# 这里我用的是find_elements_by_xpath匹配的元素,个人比较喜欢用xpath匹配,比较简单方便
comments_name = driver.find_elements_by_xpath(
'//div[@class="np-post-header"]/span[1]/a[1]')
comments_content = driver.find_elements_by_xpath(
'//div[@id="allComments"]//div[@class="np-post-content"]')
comments_vote = driver.find_elements_by_xpath(
'//div[@class="np-post-footer"]/a[1]/em')
print("第%s页" % i)
#存入字典
for comment_name, comment_content, comment_vote in zip(
comments_name[-10: ], comments_content[-10: ], comments_vote[-10: ]):
comment_one = {
'评论者': comment_name.text,
'评论内容': comment_content.text,
'评论赞': comment_vote.text
}
# 把数据插入数据库
newsdata.insert_one(comment_one)
#下面是爬取多页的评论数据,同上
while driver.find_element_by_xpath('//div[@id="loadMore"]').text == '加载更多':
page_a = len(comments_name)
driver.find_element_by_xpath('//div[@id="loadMore"]').click()
time.sleep(5)
driver.execute_script("window.scrollBy(0,6000)")
time.sleep(3)
comments_name = driver.find_elements_by_xpath(
'//div[@class="np-post-header"]/span[1]/a[1]')
comments_content = driver.find_elements_by_xpath(
'//div[@id="allComments"]//div[@class="np-post-content"]')
comments_vote = driver.find_elements_by_xpath(
'//div[@class="np-post-footer"]/a[1]/em')
page_b = len(comments_name)
i += 1
print("第%s页" % i)
for comment_name, comment_content, comment_vote in zip(
comments_name[page_a:page_b], comments_content[page_a:page_b], comments_vote[page_a:page_b]):
comment_one = {
'评论者': comment_name.text,
'评论内容': comment_content.text,
'评论赞': comment_vote.text
}
newsdata.insert_one(comment_one)
运行结果:大概爬了4000多条评论,应该没有丢失的
这里有几点注意一下:
1、爬取多页的最新短评,元素的匹配是否正常,虽然方法很多,因为这里相同名字元素太多了;
2、选择列表的数据,这里首页是10个,点击一次加载更多是20条评论,但是你打开json数据key看到有些数据不知道为什么是空的,在网页上没有展示出来的,可能是有些评论异常吧,所以这里如果是固定的每次累加20个取数据的话,取出的数据应该是有问题的,
最后,大家有什么好的方法可以评论建议一下,多谢