爬虫实例——通过JS控制滚动条
案例
有能力的童鞋可以先尝试一下爬取每张照片的链接。
我曾经尝试过几种方法,下面一一介绍:
第一种方法,采用requests和BeautifulSoup:
import requests
from bs4 import BeautifulSoup url = 'https://mm.taobao.com/self/album_photo.htm?spm=719.6642053.0.0.4JUVfm&user_id=687471686&album_id=10000702574&album_flag=0'
bs = BeautifulSoup(requests.get(url).text, 'lxml')
print len(bs('div', 'mm-photoimg-area'))
通过这种方法是得不到任何照片的,因为这个网站的照片是通过JS加载的,requests获取的源代码只是最基本的源代码,里面不含任一照片的链接。
第二种方法,采用selenium、PhantomJS和BeautifulSoup:
# -*- coding: utf-8 -*-
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
from bs4 import BeautifulSoup
from selenium import webdriver url = 'https://mm.taobao.com/self/album_photo.htm?spm=719.6642053.0.0.4JUVfm&user_id=687471686&album_id=10000702574&album_flag=0'
driver = webdriver.PhantomJS()
driver.get(url)
bs = BeautifulSoup(driver.page_source, 'lxml')
print len(bs('div', 'mm-photoimg-area'))
如无意外,你得到的结果应该是16,也就是16张图片,但是,如果你尝试滚动网页,你会发现其实并不止16张照片,这是因为淘宝采用的是ajax技术,只有通过下拉滚动条才会加载新的照片。
在网上查了好多资料都没找到解决方案,最后自己想了个办法:
# -*- coding: utf-8 -*-
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
import time
from bs4 import BeautifulSoup
from selenium import webdriver url = 'https://mm.taobao.com/self/album_photo.htm?spm=719.6642053.0.0.4JUVfm&user_id=687471686&album_id=10000702574&album_flag=0'
driver = webdriver.PhantomJS()
driver.get(url)
js1 = 'return document.body.scrollHeight'
js2 = 'window.scrollTo(0, document.body.scrollHeight)'
old_scroll_height = 0
while(driver.execute_script(js1) > old_scroll_height):
old_scroll_height = driver.execute_script(js1)
driver.execute_script(js2)
time.sleep(3)
bs = BeautifulSoup(driver.page_source, 'lxml')
print len(bs('div', 'mm-photoimg-area'))
如无意外,你得到的结果应该是45,也就是45张照片,这也是该相册的照片总数。
下面介绍一下这段代码的原理:
原理
通过js1可以获取body对象的高度,通过js2可以下拉滚动条。
先将上一次获取的body对象的高度(old_scroll_height)设为0,然后获取最新的body对象的高度,跟上一次获取的进行比较,如果比上一次的值大,就把最新的值赋值给old_scroll_height,然后下拉滚动条,休眠3秒钟,再循环比较,直到最新的值不比上一次的值大为止。
爬虫实例——通过JS控制滚动条的更多相关文章
- JS控制滚动条的位置
转载▼http://blog.sina.com.cn/s/blog_4481a3460100rwwu.html JS控制滚动条的位置:window.scrollTo(x,y); 竖向滚动条置顶 ...
- js控制滚动条的位置以及隐藏滚动条
document.documentElement.style.overflow = 'hidden'; //隐藏横竖滚动条 window.scrollTo(0,document.body.scroll ...
- 《selenium2 python 自动化测试实战》(15)——调用js控制滚动条等操作
看代码: # coding=utf-8 from time import sleepfrom selenium import webdriver driver = webdriver.Firefox( ...
- Js控制滚动条
1>全局控制 //向上滑动显示 var initTop = 0; var i = 1; $(window).scroll(function(){ var scrollTop = $(docume ...
- js控制滚动条默认在底部
html: <div id="chat_content" class="chat_content"> < ...
- python 通过js控制滚动条拉取全文 通过psutil获取pid窗口句柄,通过win32gui使程序窗口前置 通过autopy实现右键菜单和另存为操作
1.参考 利用 Python + Selenium 自动化快速截图 利用 Python + Selenium 实现对页面的指定元素截图(可截长图元素) 使用python获取系统所有进程PID以及进程名 ...
- js控制滚动条在内容更新超出时自动滚到底部
//滚动条在内容更新时自动滚到底部var message = document.getElementById('message');message.scrollTop = message.scroll ...
- js控制滚动条在最底部位置
window.scrollTo(0, document.body.scrollHeight) 如果需要始终保持在最底部,可以循环调用该方法 如果是div的 /*滚动条到地步*/ function to ...
- js控制滚动条平滑滚动到制定位置
http://www.daixiaorui.com/read/92.html 滚动到顶部: $('.scroll_top').click(function(){$('html,body').anima ...
随机推荐
- Unity操作小技巧
1.操作类 1)F:选择物体后聚焦 2)V:选择物体的顶点,顶点吸附 3)Ctrl:摁住后拖动物体,可以按照系统设置的步长进行移动(Edit -> Snap setting) 4)Q W E R ...
- 365. Count 1 in Binary【LintCode java】
Description Count how many 1 in binary representation of a 32-bit integer. Example Given 32, return ...
- adb 常用命令及操作
获取序列号: adb get-serialno 查看连接计算机的设备: adb devices 重启机器: adb reboot 重启到bootloader,即刷机模式: adb reboot boo ...
- 【转】MySQLroot用户忘记密码解决方案(安全模式,修改密码的三种方式)
文章出自:http://www.2cto.com/database/201412/358128.html 1.关闭正在运行的MySQL2.启动MySQL的安全模式,命令如下: ? 1 mysqld - ...
- 基于angular+bower+glup的webapp
一:bower介绍 1:全局安装安装bower cnpm i -g bower bower常用指令: bower init //初始化文件 bower install bower uninstall ...
- 最长回文子串计算(fail)
题意: 给定一个字符串s,在s中找到最长的回文子字符串.您可以假设s的最大长度为1000. 例子: 输入: “babad” 输出: “bab” 注: “aba”也是一个有效的答案. 我的答案: 想法: ...
- Java容器之Iterator接口
Iterator 接口: 1. 所有实现了Collection接口的容器类都有一个iterator方法用以返回一个实现了Iterator接口的对象. 2. Iterator 对象称作迭代器,用以方便的 ...
- Spring管理事务默认回滚的异常
一.默认方式 Spring的事务管理默认只对出现运行期异常(java.lang.RuntimeException及其子类),Error进行回滚. 如果一个方法抛出Exception或者Checked异 ...
- lintcode-144-交错正负数
144-交错正负数 给出一个含有正整数和负整数的数组,重新排列成一个正负数交错的数组. 注意事项 不需要保持正整数或者负整数原来的顺序. 样例 给出数组[-1, -2, -3, 4, 5, 6],重新 ...
- Xcode常见警告和错误
Xcode 升级后,常常遇到的遇到的警告.错误,解决方法 从sdk3.2.5升级到sdk 7.1中间废弃了很多的方法,还有一些逻辑关系更加严谨了.1,警告:“xoxoxoxo” is depreca ...