前几天有位微信读者问我一个爬虫的问题,就是在爬去百度贴吧首页的热门动态下面的图片的时候,爬取的图片总是爬取不完整,比首页看到的少。原因他也大概分析了下,就是后面的图片是动态加载的。他的问题就是这部分动态加载的图片该怎么爬取到。

分析

他的代码比较简单,主要有以下的步骤:使用BeautifulSoup库,打开百度贴吧的首页地址,再解析得到id为new_list标签底下的img标签,最后将img标签的图片保存下来。

headers = {

'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36'

}

data=requests.get("https://tieba.baidu.com/index.html",headers=headers)

html=BeautifulSoup(data.text,'lxml')

前面提到过,有部分图片是动态加载的,那么首先我们得弄清楚,这部分图片是怎么动态加载的。在浏览器中打开百度贴吧的首页,可以明显的看到,在往下滚动滚动条的时候,当滚动到底部的时候,滚动条缩短了,并向上移动了一段距离。这个现象也正是有DOM元素动态的添加到了html文档的一个表现。动态加载数据无非就是ajax请求,而ajax本质上就是XMLHttpRequest请求(简称xhr)。在谷歌浏览器中,我们可以通过开发者工具的network面板来监测xhr请求。

刚打开首页时的xhr请求,这里的请求都和要爬取的图片无关。

滚动条向下第1次滚动到底部,这里请求的是第20-40条热门动态,包含要爬取图片。

滚动条向下第2次滚动到底部,这里请求的是第40-60条热门动态,包含要爬取图片。并且返回的的has_more:false表明没有跟多数据了。

滚动条向下第3次滚动到底部,再无xhr请求。

解决方案

根据上面的分析,我们已经明白,单纯使用BeautifulSoup进行爬虫的时候,只能爬取到1-20条热门动态里面的图片。为了爬取到完整的热门动态里面的图片,我们则需要模拟浏览器的滚动条滚动,让网页去触发xhr请求更多的热门动态。

在python中,如果需要模拟浏览器的行为,可以使用selenium库。selenium库是一个自动化测试框架,可以用来模拟测试浏览器的各种行为,这里我们使用它来模拟浏览器打开百度贴吧的首页,并模拟滚动条向下滚动到底部的操作。

安装

pip install selenium

下载浏览器驱动

对照自己电脑安装的浏览器和对应的版本,分别从上面的地址下载驱动文件,也可以从我的github项目中统一下载以上几个驱动(地址:https://github.com/Sesshoumaru/attachments/tree/master/Selenium WebDriver)。下载解压后,将所在的目录添加系统的环境变量中。当然你也可以将下载下来的驱动放到python安装目录的lib目录中,因为它本身已经存在于环境变量(我就是这么干的)。

使用python代码模拟浏览器行为

要使用selenium先需要定义一个具体browser对象,这里就定义的时候就看你电脑安装的具体浏览器和安装的哪个浏览器的驱动。这里以火狐浏览器为例:

from selenium import webdriver

browser = webdriver.Firefox()

再模拟打开贴吧首页:

browser.get("https://tieba.baidu.com/index.html")

再模拟滚动条滚动到底部

for i in range(1, 5):

browser.execute_script('window.scrollTo(0, document.body.scrollHeight)')

time.sleep(1)

最后再使用BeautifulSoup,解析图片标签:

html = BeautifulSoup(browser.page_source, "lxml")

imgs = html.select("#new_list li img")

几个注意点

必须安装浏览器和浏览器驱动,并且浏览器和浏览器驱动要配到

即如果使用谷歌浏览器模拟网页行为,则需要下载谷歌浏览器驱动;

如果使用火狐浏览器模拟网页行为,则需要下载火狐浏览器驱动

浏览器驱动所在的目录要在环境变量中,或者定义浏览器browser的时候指定驱动的路径

selenium更多用法

查找元素

from selenium import webdriver

browser = webdriver.Firefox()

browser.get("https://tieba.baidu.com/index.html")

new_list = browser.find_element_by_id('new_list')

user_name = browser.find_element_by_name ('user_name')

active = browser.find_element_by_class_name ('active')

p = browser.find_element_by_tag_name ('p')

# find_element_by_name 通过name查找单个元素

# find_element_by_xpath 通过xpath查找单个元素

# find_element_by_link_text 通过链接查找单个元素

# find_element_by_partial_link_text 通过部分链接查找单个元素

# find_element_by_tag_name 通过标签名称查找单个元素

# find_element_by_class_name 通过类名查找单个元素

# find_element_by_css_selector 通过css选择武器查找单个元素

# find_elements_by_name 通过name查找多个元素

# find_elements_by_xpath 通过xpath查找多个元素

# find_elements_by_link_text 通过链接查找多个元素

# find_elements_by_partial_link_text 通过部分链接查找多个元素

# find_elements_by_tag_name 通过标签名称查找多个元素

# find_elements_by_class_name 通过类名查找多个元素

# find_elements_by_css_selector 通过css选择武器查找多个元素

获取元素信息

btn_more = browser.find_element_by_id('btn_more')

print(btn_more.get_attribute('class')) # 获取属性

print(btn_more.get_attribute('href')) # 获取属性

print(btn_more.text) # 获取文本值

元素交互操作

btn_more = browser.find_element_by_id('btn_more')

btn_more.click() # 模拟点击,可以模拟点击加载更多

input_search = browser.find_element(By.ID,'q')

input_search.clear() # 清空输入

执行JavaScript

# 执行JavaScript脚本

browser.execute_script('window.scrollTo(0, document.body.scrollHeight)')

browser.execute_script('alert("To Bottom")')

python 模拟浏览器selenium 微信_python爬虫:使用Selenium模拟浏览器行为相关推荐

  1. python 模拟浏览器selenium 微信_Spider-Python爬虫之使用Selenium模拟浏览器行为

    分析 他的代码比较简单,主要有以下的步骤:使用BeautifulSoup库,打开百度贴吧的首页地址,再解析得到id为new_list标签底下的img标签,最后将img标签的图片保存下来. header ...

  2. python 模拟用户点击浏览器_python爬虫之selenium模拟浏览器

    1.前言 之前在异步加载(AJAX)网页爬虫的时候提到过,爬取这种ajax技术的网页有两种办法:一种就是通过浏览器审查元素找到包含所需信息网页的真实地址,另一种就是通过selenium模拟浏览器的方法 ...

  3. 适合python爬虫使用的浏览器_python爬虫:使用Selenium模拟浏览器

    一.首先准备环境 1.window10环境下 2.Selenium最新版本 pip install Selenium 3.下载浏览器驱动 下载解压后,将所在的目录添加系统的环境变量中.当然你也可以将下 ...

  4. python什么时候用框架_python爬虫-什么时候选择selenium框架框架?

    不知不觉已经从事Python编程开发5年了,Python刚开始其实不是很起眼,但是随着大数据越来越活,现在Python也越来越火了,但是目前我主要从事的Python工作还是以数据挖掘.数据爬虫技术深度 ...

  5. python selenium 进入新标签页_python 爬虫之selenium可视化爬虫

    文章目录 前文回顾 快速入门 元素定位 页面操作 等待方式 扩展程序加载 点击此处,获取海量Python学习资料! 之所以把selenium爬虫称之为可视化爬虫 主要是相较于前面所提到的几种网页解析的 ...

  6. python信息检索和评价系统_Python爬虫实现的微信公众号文章下载器

    所以我就想有什么方法能否将这些公众号文章下载下来.这样的话,看起来也方便.但是网上的方法要么太复杂(对于我这个爬虫入门新手来说),要么付费. 但我的需求其实却很简单--"方便的查找 / 检索 ...

  7. python 下载公众号文章_Python爬虫实现的微信公众号文章下载器

    平时爱逛知乎,收藏了不少别人推荐的数据分析.机器学习相关的微信公众号(这里就不列举了,以免硬广嫌疑).但是在手机微信上一页页的翻阅历史文章浏览,很不方便,电脑端微信也不方便. 所以我就想有什么方法能否 ...

  8. python爬取虎扑评论_python爬虫系列Selenium定向爬取虎扑篮球图片详解

    前言: 作为一名从小就看篮球的球迷,会经常逛虎扑篮球及湿乎乎等论坛,在论坛里面会存在很多精美图片,包括NBA球队.CBA明星.花边新闻.球鞋美女等等,如果一张张右键另存为的话真是手都点疼了.作为程序员 ...

  9. python输入学号查成绩_Python实践学习笔记:模拟登录教务系统实现微信查成绩

    python+selenium+itchat模拟登录学校教务系统,获取个人成绩,通过微信发送. 先看看最终效果: 〇.背景 学习python一段时间,觊觎学校的教务系统很久了. 寒假开始,大部分同学陆 ...

最新文章

  1. 远程办公的难点在哪?
  2. 用window.open在同一个新窗口中访问指定url【IE页面缓存问题】
  3. makefile常见伪目标(.PHONY 不会去检查目标文件)
  4. 为什么属龙的有二婚命_76年属龙的二婚在什么时候,76属龙女人婚姻命运怎么样...
  5. 12c oracle 激活_Oracle 12C 安装教程
  6. Nature Biotechnology | 单细胞转录组不同建库及数据分析方法的测评结果
  7. 【数字图像处理】C++读取、旋转和保存bmp图像文件编程实现
  8. Pro Silverlight 5 in C# 分享
  9. 事件选择WSAEventSelect
  10. 使用sp_cycle_errorlog 命令清除sqlserver数据库错误日志
  11. ndk-build官方使用说明
  12. 利用OFBiz实现Single Sign On单点登录
  13. 24_多易教育之《yiee数据运营系统》OLAP平台-运营分析篇
  14. DB9接口定义 串口接口定义 MAX232电路
  15. 黑科技 未来人们可用身体这7个部位来控制设备
  16. 结构体定义 typedef struct LNode 用法说明
  17. 论文研读 —— 4. You Only Look Once Unified, Real-Time Object Detection (1/3)
  18. 计算机itpt证书有什么用,ITPT信息技术应用专业能力培训项目认证课程体系表.pdf...
  19. node.js - 收藏集
  20. BIM模型到3Dtiles转换后精确定位工作流及存在的问题

热门文章

  1. 汇编语言--屏幕输出语句 hello world!
  2. macbookpro可以自学python吗_学习python,office等,是否推荐购买macbookpro?
  3. 转:击溃“部门墙”,才能破茧重生
  4. 使用AccessibilityService实现APP的自动安装与卸载
  5. C语言字符串函数,内存函数讲解及其模拟
  6. 《人生的智慧》良句收录和观后观想
  7. 什么是招商证券股票交易接口?
  8. 【天光学术】演讲稿:校园讲文明树新风
  9. Hive详解(一)Hive是什么Hive怎么用
  10. 【lvcreate】创建lv需要在vg上创建