动态网页爬取多页

今天爬取的是腾讯视频的最新短评(鬼吹灯之黄皮子坟)的评论者、最新短评内容、评论赞;
首先分析一下要爬取的网页

动态网页爬取多页_第1张图片
首次加载出的最新短评

点击更多,看下url是否会变化

动态网页爬取多页_第2张图片
点击加载更多之后

由此看出应该是动态加载的
其实刚开始我还看了这些数据是json,还想着用构造url,直接请求的方法去爬,但是看完请求url就放弃了;

动态网页爬取多页_第3张图片
Paste_Image.png
Paste_Image.png

这里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多条评论,应该没有丢失的


动态网页爬取多页_第4张图片
Paste_Image.png

这里有几点注意一下:
1、爬取多页的最新短评,元素的匹配是否正常,虽然方法很多,因为这里相同名字元素太多了;
2、选择列表的数据,这里首页是10个,点击一次加载更多是20条评论,但是你打开json数据key看到有些数据不知道为什么是空的,在网页上没有展示出来的,可能是有些评论异常吧,所以这里如果是固定的每次累加20个取数据的话,取出的数据应该是有问题的,

最后,大家有什么好的方法可以评论建议一下,多谢

你可能感兴趣的:(动态网页爬取多页)