博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python3从零开始爬取今日头条的新闻【三、滚动到底自动加载】
阅读量:5323 次
发布时间:2019-06-14

本文共 2425 字,大约阅读时间需要 8 分钟。

所谓爬虫,就是通过编程的方式自动从网络上获取自己所需的资源,比如文章、图片、音乐、视频等多媒体资源。通过一定的方式获取到html的内容,再通过各种手段分析得到自己所需的内容,比如通过BeautifulSoup对网页内容进行解析提取。

本文通过selenium的webdriver模拟浏览器来浏览网页,通过lxml库解析得到咱所需的内容。下面开始我们的爬虫工作。

本文目录:

1.目标

我们今天的目标是自动加载多页新闻内容的:标题、图片、作者、类型、发布时间

在浏览器里,头条的首页是可以不断滑动到底自动加载下一页新闻内容的,我们在上一篇文章 中实现的,只能获取第一页的10条新闻,因为这些新闻内容是通过异步请求刷新的,本节我们将实现自动循环加载N页新闻内容

2.实现

2.1、模拟页面滚动到底

我们看下在上一节实践中我们写的代码:

"""    获取头条首页内容    """    def __getTouTiaoHtml(self, url):                # 简单的入参校验        if url and '' != url and url.startswith("http"):                        # 浏览器打开页面            self.__browser.get(url)            try:                # 此处等到我们所需的热文元素加载出来了再进行下一步,避免页面还没加载完成就去解析内容导致内容为空                element = WebDriverWait(self.__browser, 10).until(                    EC.presence_of_element_located((By.XPATH, "//ul/li/div[@ga_event=article_item_click]"))                )                                except Exception as ex:                print(ex)            finally:                pass                     resHtml = self.__browser.page_source            return resHtml

在try-catch 那里只是等待页面加载完成出现新闻内容的布局元素后,就往下继续执行了,所以这里只能加载一页数据。找到问题就好办了,那么我们在 resHtml = self.__browser.page_source 这行代码之前,加一段代码实现循环模拟滑动滚动条到底部触发自动加载机制来加载更多内容:

1、简单实现:通过滑动到底后,sleep一定时间来保障分页内容加载完成:

try:     """ 模拟滚动到底部加载下一页,一共循环6次,每次等待4s,这个时间根据网速调整,如果你需要获取更多,那么把循环的范围加大就行了。     """    for i in range(1, 6):        self.__browser.execute_script('window.scrollTo(0, document.body.scrollHeight)')        time.sleep(4)except Exception as ex:    print(ex)

最后,重新执行下,就能看到效果了,总共获取了70条新闻内容


2、高逼格一点的方法:我们分析下图布局:

在这里插入图片描述
加载中…这个布局,在新的分页内容加载过程中,这个style的display值不是none,而当加载完成后,这个display值变为none了,根据这个规律,我们可以根据底部这个加载中的布局从可见到隐藏状态的切换,来表示分页内容加载完成了,具体代码如下,替换上面方法1中的sleep(4):

try:	# 模拟滚动到底部	for i in range(1, 6):	   self.__browser.execute_script('window.scrollTo(0, document.body.scrollHeight)')	   # sleep(4)  替换为下面的方式来监听分页内容是否加载完成了。	   try:	        # 此处等到我们所需的热文元素加载出来了再进行下一步,避免页面还没加载完成就去解析内容导致内容为空	       element = WebDriverWait(self.__browser, 10).until(	           EC.presence_of_element_located((By.XPATH, '//span[contains(text(), "加载中")]/../div[@class="feed-infinite-wrapper"]/div[contains(@class, "ball-pulse")][contains(@class, "loading")][@style="display: none;"]'))	       )	   except Exception as ex:	       pass	       except Exception as ex:     print(ex)

本文完整代码 →:


全文完结,后续实现用其它框架来爬虫新闻资源。敬请期待~



参考资料:

[1]:

[2]:
[3]:
[4]:
[5]: 其他所有分享过python学习填坑网友的经验

转载于:https://www.cnblogs.com/xiaocy66/p/10589236.html

你可能感兴趣的文章
XmlDocument
查看>>
delphi 内嵌汇编例子
查看>>
SQL server 2012 安装SQL2012出现报错: 启用 Windows 功能 NetFx3 时出错
查看>>
【luogu P2298 Mzc和男家丁的游戏】 题解
查看>>
前端笔记-bom
查看>>
MATLAB作图方法与技巧(一)
查看>>
上海淮海中路上苹果旗舰店门口欲砸一台IMAC电脑维权
查看>>
Google透露Android Market恶意程序扫描服务
查看>>
Java IO编程全解(六)——4种I/O的对比与选型
查看>>
CentOS7安装CDH 第十一章:离线升级CDH版本
查看>>
给mysql数据库字段值拼接前缀或后缀。 concat()函数
查看>>
EasyAACEncoder海思/ARM平台优化G711、G726转AAC的CPU占用高问题
查看>>
HttpGet和HttpPost
查看>>
oc基本控件
查看>>
迷宫问题
查看>>
用JavaScript截图
查看>>
【FZSZ2017暑假提高组Day9】猜数游戏(number)
查看>>
泛型子类_属性类型_重写方法类型
查看>>
eclipse-将同一个文件分屏显示
查看>>
NOIP2013提高组 解题报告
查看>>