回顾
前面我们学习了如何爬取一个静态网页和数据存储,那么这章我们就学如何爬取动态网页?
区分动态与静态的区别
在前面我们需要爬取的网址的源码,会出现我们要爬取的内容,这就是静态,但是,相反地,并不会出现我们想要爬取的内容的网站就是属于动态网页。那么我们会想这两个网页优缺点在哪,动态网页的优点有:以数据库为根基,工作量少;能够完成许多功效;内容更新快等等。而静态网页的好处是速度快,可以跨平台,跨服务器。
逆向分析爬取动态网页
所为逆向,就是把一个积木搭好,又参照原来搭好的途径拆开。想要利用这方法就得知道动态网页是怎么实现的?
静态网页是使用HTML语言的,而动态网页是使用HTML+ASP 或 HTML+PHP 或 HTML+JSP 。那我们就是让他变回原来那么模样就完了。而谷歌浏览器的开发这工具即=就可以帮我们解决这个问题。我们使用人邮出版社官网来看看具体怎么操作:
在确认网页是动态网页后,需要获取从网页响应中由JavaScript动态加载生成的信息,在Chrome浏览器中爬取"http://www.ptpress.com.cn"网页的信息,步骤如下。
第一步,“F12"键打开"
“网页的Chrome开发者工具,如图所示:
第二步,单击网络面板后,发现有很多响应。在网络面板中XHR是Ajax中的概念,表示XML-HTTP-request,一般avascript加载的文件隐藏在JS或者XHR。通过查找发现,“http://www.ptpress.com.cn"网页。
“新书”模块的信息在XHR的Preview标签中有需要的信息。在网络面板的XHR中,查看”/bookinfo”资源的Preview信息,可以看到网页新书的HTML信息,如图所示:
若需要爬取"http://www.ptpress.com.cn"网页标题信息,则步骤如下:
第一步,单击”/bookinfo”资源的Headers标签,找到“Request URL"信息,如图所示:
第二步:打开“Request URL"URL网址信息,找到需要爬取的信息,如图所示:
使用Selenium库爬取动态网页
使用Selenium库需要下载chromedrive补丁,我们在这个网址http://npm.taobao.org/mirrors/chromedriver/下载对应谷歌浏览器版本的补丁,将下载好的chromedrive.exe文件,存放至python安装根目录(与python.exe文件同一目录)即可。
我们可以使用Selenium库直接获取到网页的源码:
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('http://www.ptpress.com.cn/')
driver.page_source #查看网页真正的源码
在这个源码内容中,我们就可以直接查找到我们想要爬取的新书内容。并且它会在另外一个窗口打开一个新的网页,在这个网页中,我们可以通过编程进行搜索点击:
我们用程序关闭网页窗口:driver.close()
。
我们举个例子操作一下说明具体知识点,我们想要编程实现在人邮的官网上搜索“python编程”,在产生的新页面爬取相关书籍和价格:
from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get('http://www.ptpress.com.cn/shopping/index')
wait = WebDriverWait(driver, 10) #设置等待时间
before = driver.current_window_handle #
search_btn = driver.find_element_by_css_selector(
'body > div.classifySearch-p > div > div.classifySearchBar > div.allSearch > input'
)
search_btn.send_keys('python编程') #在输入框输入python编程
confirm_btn = wait.until(
EC.element_to_be_clickable(
(By.CSS_SELECTOR, 'body > div.classifySearch-p > div > div.classifySearchBar > div.allSearch > a > i')
)
)
confirm_btn.click() #找到搜索的按钮并点击
driver.switch_to_window(driver.window_handles[1]) #移动窗口
html = driver.page_source #获取新窗口源代码
#下面就是类于爬取静态网页
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
dat = [i.text for i in soup.select('#search > div.book-floor > ul > li > p')]
print(dat[::2])
print(dat[1::2])
import pandas as pd
pd.DataFrame({'价格':dat[1::2], '名称': dat[::2]}) #做成dataframe
部分dataframe:
在这个例子中,涉及到的:
第一,在输入框输入python编程,得先利用开发者工具找到输入框的selector路径,在输入相关内容。
第二,点击搜索这个内容道理也是一样的,只不过点击的代码不一样。
第三,设置页面等待时间,如果在这个时间没有找到元素,那么便会抛出异常。
另外,除了这些方法可以调用,Selenium库还提供了一些便利的判断方法和关于元素选取的: