当前位置: 首页 > 科技观察

手把手教你写一个网络爬虫(五):PhantomJS实战

时间:2023-03-21 16:49:41 科技观察

本系列:《手把手教你写网络爬虫(1):网易云音乐歌单》《手把手教你写网络爬虫(2):迷你爬虫架构》?《手把手教你写网络爬虫(4):Scrapy入门》大家好!从今天开始,我将和大家一起打造一个属于自己的分布式爬虫平台,同时也会详细介绍其中涉及到的技术。如果您有什么好的想法,欢迎留言,多提意见,共同完善我们的爬虫平台。在正式介绍平台之前,我会用一些篇幅对基础文章进行补充。这次模拟滚动的目标是爬取一个众筹网站上的所有项目。项目列表页面如下:https://www.kaistart.com/project/more.html。打开分析后,页面显示10条:如果想看更多条,不能像网易云音乐那样点击“下一页”翻页,需要下拉滚动条或者向下滚动鼠标滚轮触发异步请求。爬虫应该如何处理这种情况呢?我们可以使用selenium的api执行js代码,将屏幕内容滚动到指定位置。下面这段代码将向下滚动项目页面,直到它停止:#Scrollto***partjs1='returndocument.body.scrollHeight'js2='window.scrollTo(0,document.body.scrollHeight)'old_scroll_height=0whilebrowser.execute_script(js1)>=old_scroll_height:old_scroll_height=browser.execute_script(js1)browser.execute_script(js2)time.sleep(1)scrollTo()方法可以将内容滚动到指定坐标:参数说明xpos必填。要显示在窗口文档显示区域左上角的文档的x坐标。ypos必填。要显示在窗口文档显示区域左上角的文档的y坐标。这里用到了ScrollHeight,它和ClientHeight、OffsetHeight有什么区别呢?browser=webdriver.PhantomJs()url='https://www.kaistart.com/project/more.html'try:browser.get(url)wait=ui.WebDriverWait(browser,20)wait.until(lambdadr:dr.find_element_by_class_name('project-detail').is_displayed())#一直滚动到***部分js1='returndocument.body.scrollHeight'js2='window.scrollTo(0,document.body.scrollHeight)'old_scroll_height=0whilebrowser.execute_script(js1)>=old_scroll_height:old_scroll_height=browser.execute_script(js1)browser.execute_script(js2)time.sleep(1)sel=Selector(text=browser.page_source)proj_list=sel.xpath('//li[@class="project-li"]')browser.save_screenshot(debug.png')这样会把图片保存在工程目录下,打开看看:browser=webdriver.Chrome()再次运行程序,果不其然,Chrome浏览器弹出,不仅正确显示页面,而且一直滚动:所有项目都显示出来了,随便爬!什么?你问我怎么爬上linux服务器?纯命令行之一?fromseleniumimportwebdriverfrompyvirtualdisplayimportDisplaydisplay=Display(visible=0,size=(800,600))display.start()driver=webdriver.Chrome()driver.get("http://www.baidu.com")print(driver.page_source.encode('utf-8'))driver.quit()display.stop()