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

分析

他的代码比较简单,主要有以下的步骤:使用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. 【Spring】通过动态代理改进银行转账事务控制
  2. flink 自定义 窗口_Flink入门实战 (下)
  3. aspose java_Aspose.Cells for Java
  4. python中的functools模块
  5. 大数据技术周报第 004 期
  6. CodeForces 698A - Vacations (Codeforces Round #363 (Div. 2))
  7. 线段树,最大值查询位子(个人模版)
  8. error: L6235E: More than one section matches selector - cannot all be FIRST/LAST.
  9. 友商对于鸿蒙系统,谷歌新系统上线!鸿蒙面临生死线考验,华为喊话友商,被小米拒绝...
  10. C++求解汉字字符串的最长公共子序列 动态规划
  11. 地理和遥感数据获取方法
  12. AD7606应用笔记
  13. 运行tensorflow程序,出现ImportError: cannot import name '_validate_lengths'错误的解决办法
  14. div+css显示两行或三行文字
  15. Tomcat详细配置(全)
  16. uefi启动 多硬盘gtp_关于UEFI启动+GPT分区的一些经验
  17. “泰迪杯”挑战赛 - 通过数据挖掘技术实现道路缺陷自动识别
  18. 618闭着眼睛买都不会错的三款好物!当贝投影最推荐?!
  19. 使用esp8266作为I2C传感器的主机
  20. 【Python之pymysql库学习】二.游标cursor的相关知识(保姆级图文+实现代码)

热门文章

  1. CSS文字颜色渐变特效
  2. 荣耀 Magicbook16 Pro和联想小新Pro16参数对比选哪个好
  3. LeetCode刷题2
  4. C#流程控制(详细)
  5. ubuntu数字小键盘不能输入数字解决办法
  6. oracle 11c安装包
  7. HTTP与HTTPS
  8. 文件上传(JavaScript实现)
  9. Python3爬虫(一)抓取网页的html
  10. Python发送邮件提醒