手把手教你写网络爬虫(5):PhantomJS实战

开发 后端
从今天开始,我要与大家一起打造一个属于我们自己的分布式爬虫平台,同时也会对涉及到的技术进行详细介绍。大家如果有什么好的想法请多留言,多提意见,一起来完善我们的爬虫平台。

本系列:

大家好!从今天开始,我要与大家一起打造一个属于我们自己的分布式爬虫平台,同时也会对涉及到的技术进行详细介绍。大家如果有什么好的想法请多留言,多提意见,一起来完善我们的爬虫平台。在正式介绍平台之前,先用一些篇幅对基础篇做一点补充。模拟滚动

这次的目标是爬一个众筹网站的所有项目,项目列表页如下:https://www.kaistart.com/project/more.html。打开后进行分析,页面显示出10个项目:

如果想看到更多项目,并不能像网易云音乐那样点“下一页”翻页,而是需要向下拉滚动条或者向下滚动鼠标滚轮来触发异步请求。爬虫该如何应对这种情况呢?我们可以使用selenium的api执行js代码将屏幕内容滚动到指定位置。

下面这段代码会一直向下滚动项目页,一直到滚不动为止:

 

  1. # 一直滚动到***部  
  2. js1 = 'return document.body.scrollHeight'  
  3. js2 = 'window.scrollTo(0, document.body.scrollHeight)'  
  4. old_scroll_height = 0  
  5. while browser.execute_script(js1) >= old_scroll_height:  
  6.     old_scroll_height = browser.execute_script(js1)  
  7.     browser.execute_script(js2)  
  8.     time.sleep(1) 

scrollTo() 方法可把内容滚动到指定的坐标:

参数 描述
xpos 必需。要在窗口文档显示区左上角显示的文档的 x 坐标。
ypos 必需。要在窗口文档显示区左上角显示的文档的 y 坐标。

这里用到了scrollHeight,它和ClientHeight还有OffsetHeight有什么区别呢?

 

  1. browser = webdriver.PhantomJs()  
  2. url = 'https://www.kaistart.com/project/more.html'  
  3. try:  
  4.     browser.get(url)  
  5.     wait = ui.WebDriverWait(browser, 20)  
  6.     wait.until(lambda dr: dr.find_element_by_class_name('project-detail').is_displayed())   
  7.  
  8.     # 一直滚动到***部  
  9.     js1 = 'return document.body.scrollHeight'  
  10.     js2 = 'window.scrollTo(0, document.body.scrollHeight)'  
  11.     old_scroll_height = 0  
  12.     while browser.execute_script(js1) >= old_scroll_height:  
  13.         old_scroll_height = browser.execute_script(js1)  
  14.         browser.execute_script(js2)  
  15.         time.sleep(1)  
  16.     sel = Selector(text=browser.page_source)  
  17.     proj_list = sel.xpath('//li[@class="project-li"]' 

  1. browser.save_screenshot(debug.png')  

这样就会把图片保存在项目目录,打开看看:

 

  1. browser = webdriver.Chrome() 

再次运行程序,不出所料,Chrome浏览器弹出来,不仅能够正确显示页面,还一直在滚动:

[[229494]]

项目全都刷出来了,想爬什么就爬吧!什么?你问我在Linux服务器上怎么爬?纯命令行的那种吗?

[[229495]]

 

  1. from selenium import webdriver  
  2. from pyvirtualdisplay import Display   
  3.  
  4. display = Display(visible=0, size=(800, 600))  
  5. display.start()  
  6. driver = webdriver.Chrome()  
  7. driver.get("http://www.baidu.com" 
  8. print (driver.page_source.encode('utf-8'))  
  9. driver.quit()  
  10. display.stop() 

 

 

责任编辑:庞桂玉 来源: Python开发者
相关推荐

2018-05-16 13:50:30

Python网络爬虫Scrapy

2018-05-14 16:34:08

Python网络爬虫Scrapy

2018-05-22 15:30:30

Python网络爬虫分布式爬虫

2018-05-14 15:27:06

Python网络爬虫爬虫架构

2018-05-22 16:28:46

Python网络爬虫URL去重

2018-05-14 14:02:41

Python爬虫网易云音乐

2020-07-10 08:24:18

Python开发工具

2023-03-27 08:28:57

spring代码,starter

2021-01-30 10:37:18

ScrapyGerapy网络爬虫

2021-07-14 09:00:00

JavaFX开发应用

2011-01-10 14:41:26

2011-05-03 15:59:00

黑盒打印机

2021-11-09 09:01:36

Python网络爬虫Python基础

2021-04-01 09:02:38

Python小说下载网络爬虫

2022-03-08 11:17:54

函数指针回调函数C语言

2023-04-26 12:46:43

DockerSpringKubernetes

2022-03-14 14:47:21

HarmonyOS操作系统鸿蒙

2022-07-27 08:16:22

搜索引擎Lucene

2022-01-08 20:04:20

拦截系统调用

2022-12-07 08:42:35

点赞
收藏

51CTO技术栈公众号