用Python爬虫爬取澎湃新闻【动态网页:Ajax 动态请求、异步刷新生成数据】的搜索结果(附代码讲解与整套代码)

一、准备工作
1、本段代码要用到Python中的selenium模块,需要提前进行加载。主要加载方式是在Python中的命令行中输入 pip install selenium。
注:当直接用 pip install selenium下载不了selenium模块时,可能是国内的镜像出现了问题,可以加入豆瓣镜像来帮助下载(网上有说清华的、阿里云的、中科大的,就我的实验来看,豆瓣是最管用的),代码如下:
pip install 模块名 -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
这里附上另一个博主的解决链接:
https://blog.csdn.net/qq_41906429/article/details/95252447?spm=1001.2014.3001.5506
2、具体来说,这里用到的是selenium模块中的webdriver。我的理解的话,就是字面意思,可以将webdriver看作一双操控浏览器的手手。既然爬虫中有了操控浏览器的手,那么相应的浏览器中也应该有与之对接的东西。这里需要特别注意一点,webdriver是个"奢侈品牌",它在一般的浏览器中是行不通的哦(如360),只在比较大型的浏览器中才可以,我用的是谷歌。回到前面说的,谷歌浏览器中应该有与webdriver对接的东西,它叫做chromedriver。咱们需要把它事先下载安装好,具体步骤见我的另一篇文章(https://blog.csdn.net/fighting_jiang/article/details/116298853?spm=1001.2014.3001.5501)
二、分析页面结构
1、分析澎湃新闻页面结构
打开澎湃新闻官网,你会发现,不管你搜啥,搜索结果页面的网址(https://www.thepaper.cn/searchResult.jsp)丝毫没有变化,并且只有不断向下滑动页面才能加载所有搜索结果。
这就需要我们进入搜索结果页面的网址(https://www.thepaper.cn/searchResult.jsp),再运用webdriver操控浏览器,在该网址的搜索框里输入你想搜索的关键词,并点击搜索键,然后模拟人进行下滑页面的操作,以加载所有搜索结果。
三、代码实现及解读
1、引入time和webdriver模块

import time
from selenium import webdriver

注:这里引入time是为了给浏览器一个加载的时间,以防因时间不够,浏览器没有完全加载完成,而出现报错的情况
2、通过webdriver操纵引擎,使浏览器进入指定页面

url = 'https://www.thepaper.cn/searchResult.jsp'
driver = webdriver.Chrome()
driver.get(url)

3、设置等待时间,使页面数据完全加载,这里的单位是秒

time.sleep(3)

4、定位搜索框,输入待搜索关键词,并定位搜索键,点击搜索键
这里用到的是Xpath来完成定位,所谓Xpath,可以理解为让python在网页源码中找到搜索框的一条路径。一个比较容易获取搜索框以及搜索键对应的Xpath的方法是:
a、鼠标定位到搜索框,点击鼠标右键,点击检查,具体如下图圈红位置
在这里插入图片描述
b、你会发现,代码中会有一段突出显示,这一段就是搜索框对应的代码位置,将鼠标挪动到这行突出显示的代码,按下图我标注的顺序依次点击,这样便可以复制到搜索框对应的Xpath
在这里插入图片描述
c、运用send_keys在python已找到的搜索框中输入待搜索关键词,我输入的是四川成都,具体代码如下:

driver.find_element_by_xpath('/html/body/div[5]/div[1]/div/div[1]/form/input[1]').send_keys('四川成都')

是不是还挺好玩?
d、重复上述a,b,c步骤,定位搜索键,并用click()实现点击操作,并且在点击后给页面6s(自己随意定)的时间去加载数据,具体代码如下:

driver.find_element_by_xpath('/html/body/div[5]/div[1]/div/div[1]/form/input[5]').click()

time.sleep(6)

5、运用Xpath定位所有文章链接,将鼠标放置在某个文章标题上(下图标号1处),点击鼠标右键,点击检查,会发现右侧代码中某行突出显示,将鼠标置于此处,点击鼠标右键,在Copy中选择Copy Xpath。这里得到的仅是一篇文章链接的Xpath,那么所有文章的Xpath如何得到呢?且看第6点
在这里插入图片描述
6、要解决这个问题,首先要提到一个工具,名为Xpath Helper,是Chrome中的一个插件。在Chrome的网上应用店很容易就下得到,下好之后进行解压,打开Chrome的扩展程序(具体位置:按下图圈红位置所标的123顺次点击)。
在这里插入图片描述
进入扩展程序之后,打开开发者模式,点击“加载已解压的扩展程序”按钮,将Xpath Helper添加在Chrome中。
在这里插入图片描述
7、仔细观察网页源码,会发现所有搜索结果文章都在属性class="search_res"的div里,具体链接在div中的h2中的a中,根据Xpath的语法,@表示属性,所以所有文章的Xpath可以表示为://div[@class=“search_res”]/h2/a。
在这里插入图片描述

点击下图标号1处,打开Xpath Helper,在下图标号2处,粘贴//div[@class=“search_res”]/h2/a,在右侧框里会出现所有文章的标题,由此证明,这条Xpath是正确的。
在这里插入图片描述
在这里插入图片描述
8、至此,我们已经得到了所有文章的Xpath,然后运用for循环和scrollTo实现页面的不断下滑,以加载所有搜索结果。并且用get_attribute得到所有a中的href,具体代码如下:

for i in range(20):
    i += 1

    time.sleep(3)
    el_list = driver.find_elements_by_xpath('//div[@class="search_res"]/h2/a')
    for el in el_list:
        print(el.get_attribute('href'))


    js = 'scrollTo(0,{})'.format(i*8000)
    driver.execute_script(js)

9、最后停止即可

driver.quit()

10、完整代码如下,运行时尤其要注意的是,webdriver第一次操控页面下滑时,可能直接就滑到底了,但其实,上面的数据并未完全加载完成,那么就需要我们去手动滑动鼠标,将页面滑到正在加载的地方,之后它就可以自己滑,自己加载啦,就不用我们操心啦

import time
from selenium import webdriver

url = 'https://www.thepaper.cn/searchResult.jsp'
driver = webdriver.Chrome()

driver.get(url)

time.sleep(3)

driver.find_element_by_xpath('/html/body/div[5]/div[1]/div/div[1]/form/input[1]').send_keys('四川成都')

driver.find_element_by_xpath('/html/body/div[5]/div[1]/div/div[1]/form/input[5]').click()

time.sleep(6)

for i in range(20):
    i += 1

    time.sleep(3)
    el_list = driver.find_elements_by_xpath('//div[@class="search_res"]/h2/a')
    for el in el_list:
        print(el.get_attribute('href'))


    js = 'scrollTo(0,{})'.format(i*8000)
    driver.execute_script(js)

driver.quit()

由此,我们便得到了所有搜索结果的链接,得到链接之后呢,我直接用的是集搜客的升级版数据管家进行爬取,选取某条链接,自己定义规则(自己选择链接对应的文章里你想爬取的部分)之后,直接保存规则,点击爬数据之后,爬取完毕时,将所有网址添加上去,进行集搜,因为网页结构一致,所以接下来就是电脑自己爬啦,咱们就解放双手啦。当然了,会有一部分爬取失败,这是因为网页结构不一样。大家可以在得到所有搜索结果的链接之后,基于网页结构对网址进行分类,这样分类爬取文章内容,结果更佳哦!

至此,教程结束啦,欢迎大家一起讨论交流,科研小白——小江祝大家身体健康,平安喜乐!

  • 5
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值