python语言网络爬虫学习(三)

回顾

前面我们学习了如何爬取一个静态网页和数据存储,那么这章我们就学如何爬取动态网页?

区分动态与静态的区别

在前面我们需要爬取的网址的源码,会出现我们要爬取的内容,这就是静态,但是,相反地,并不会出现我们想要爬取的内容的网站就是属于动态网页。那么我们会想这两个网页优缺点在哪,动态网页的优点有:以数据库为根基,工作量少;能够完成许多功效;内容更新快等等。而静态网页的好处是速度快,可以跨平台,跨服务器。

逆向分析爬取动态网页

所为逆向,就是把一个积木搭好,又参照原来搭好的途径拆开。想要利用这方法就得知道动态网页是怎么实现的?
静态网页是使用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库还提供了一些便利的判断方法和关于元素选取的:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值