Python网络爬虫(第三篇)
一、动态网页的爬取
现在主流网站使用JavaScript展现网页内容,和静态网页不同的是,使用JavaScript时,很多内容并不会出现在HTML源代码中,所以我们需要用到动态网页抓取的技术:1:通过浏览器审查真实网页地址;2使用Selenium模拟浏览器。
异步更新技术——AJAX(Asynchronous Javascript And XML,异步JavaScript和XML):在后台与服务器进行少量数据交换就可以使网页实现异步更新。也就是使整个网页可以不用通过重新加载的情况下对网页的某部分进行更新。它不仅减少了网页的重新下载,也节省了流量,因此AJAX得到广泛使用。使用AJAX网页使得互联网应用程序更小、更快、更友好。
动态网页的实例:评论区的实现,淘宝网店铺的评价(就是你点击某个条目的时候URL没变,但它显示的内容变了)
例如
点击这些栏目他的URL不变,而数字变了
二、分析动态网页
以天猫iPhone12为例
1:定位到该网页,点击累计评价
2:检查页面
该累计评价出现了class=“J_ReviewsCount”,这说明该数据由JavaScript控制的。
三、真实地址抓取
1:找到目标网页——单击鼠标右键——检查——Network——找到真正的文件(json格式的文件)——点击该文件——点击Headers——获得URL——在代码中直接带入该URL。
例如本例:(唐老师的网站)
检查:
2:使用json_string[json_string.find(‘{‘}:-2)],仅仅提取字符串符合json格式的部分。然后,使用json.loads可以把字符串格式的响应体数据转化为json数据,接下来,利用json数据结构,我们可以将数据提取到评论的列表comment_list,最后提取其中的文本并输出。
利用真实地址爬取评价,代码如下:
import requests
import json
link='https://api-zero.livere.com/v1/comments/list?' \
'callback=jQuery1124013771440424332337_' \
'1608297951950&limit=10&' \
'repSeq=4290319&requestPath=%2Fv1%' \
'2Fcomments%2Flist&consumerSeq=1020' \
'&livereSeq=28583&smartloginSeq=5154&code=&_=1608297951952'
headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'
' AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/87.0.4280.88 Safari'
'/537.36 Edg/87.0.664.66'}
r=requests.get(url=link,headers=headers)
print(r.status_code)
print(r.text)
json_string=r.text
json_string=json_string[json_string.find('{'):-2]#提取字符串符合json格式的部分
json_data=json.loads(json_string)#把提取json格式字符串转换为json数据
coment_list=json_data['results']['parents']#利用json结构存到comment_list
#循环输出
for eachone in coment_list:
message=eachone['content']
print(message)
运行后的结果:
3:在爬取信息时,我们经常需要爬取所有页面,人工一页页地翻页查评论数据的地址会显得很麻烦,所以我们可以通过URL的变化规律去轻松爬取所有评论。
例如小编上一篇中的Top250电影的URL就是根据其规律的变化而更新页面爬取的内容。
四、通过Selenium模拟浏览器抓取
在某些网页中,使用“检查”功能很难找到调用的网页地址,还有某些数据真实地址的URL也十分冗长和复杂,某些网站为了反爬取而对这些地址进行加密。
因此有了这种方法:使用浏览器渲染引擎,直接用浏览器在显示网页时解析HTML、应用CSS样式并执行JavaScript的语句。这种方法在爬虫过程中会打开一个浏览器加载该网页,自动操作浏览器浏览各个网页,顺便把数据抓取下来。(相当于把动态网页变为静态网页)
我们可以用Python的Selenium库模拟浏览器完成抓取。Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,浏览器自动按照脚本代码做出单击、输入、打开、验证等操作。
1:Selenium的脚本可以控制浏览器进行操作,可以实现多个浏览器的调用。
此处以IE浏览器为例:
使用Selenium打开浏览器和一个网页。
from selenium import webdriver
driver=webdriver.Ie(executable_path=r'C:\Users\86182\Desktop\IEDriverServer.exe')
driver.get('https://image.baidu.com/search/index?'
'tn=baiduimage&ct=201326592&lm=-1&'
'cl=2&ie=gb18030&word=%D0%A3%BB%A8&'
'fr=ala&ala=1&alatpl=adress&pos=0&hs=2&xthttps=111111')
记得自己安装:selenium库和IEDriverServer.exe
IEDriverServer.exe的安装通过driver=webdriver.Ie()该代码运行后报错给出的地址安装符合自己电脑信息的版本即可。
我使用的是Python3.8版本,IE浏览器为X64.
运行之后,他会帮你打开对应网站
2:Selenium的实例
我们将使用Selenium方法获取评论数据。
第一步:找到评论的HTML代码标签,“检查”功能定位到评论标签。
第二步:尝试获取一条评论数据。代码如下:
from selenium import webdriver
driver=webdriver.Ie(executable_path=r'C:\Users\86182\Desktop\IEDriverServer.exe')
driver.get('http://www.santostang.com/2018/07/15/4-3-%e9%80%9a%e8%bf%87selenium-%e6%a8%a1%e6%8b%9f%e6%b5%8f%e8%a7%88%e5%99%a8%e6%8a%93%e5%8f%96/')
driver.switch_to.frame(driver.find_element_by_css_selector("iframe[title='livereAd']"))
comment=driver.find_element_by_css_selector('div.reply-content')
content=comment.find_element_by_tag_name('p')
print(content.text)
运行后会打开对应的网页,并打印评论:“谢谢更新。刚在京东读书买了书,认真学习中。”
Selenium的高级操作
使用Selenium和适应浏览器“检查”的方法爬取动态网页相比,因为Selenium要在整个网页加载出来后才开始爬取内容,速度相对较慢。
因此,实际应用过程的过程中,觉得哪个使用方便就使用哪个。有些方法可以用Selenium控制浏览器加载的内容,从而加快Selenium的爬取速度。常用的方法有:
1:控制CSS的加载
2:控制图片文件的显示
3:控制JavaScript的运行
1:控制CSS:因为抓取过程中仅仅抓取页面的内容,CSS样式文件是用来控制页面的外观和元素的放置位置的,对内容并没有影响,所以我们可以限制网页加载CSS,从而减少抓取的时间。代码如下:
from selenium import webdriver
fp=webdriver.FirefoxProfile()#设定不加载css
fp.set_preference('permissions.default.stylesheet',2)
driver=webdriver.Firefox(firefox_profile=fp,executable_path=r'D:\幻想星风\Python\geckodriver.exe')
driver.get('http://www.santostang.com/2018/07/15/4-3-%e9%80%9a%e8%bf%87selenium-%e6%a8%a1%e6%8b%9f%e6%b5%8f%e8%a7%88%e5%99%a8%e6%8a%93%e5%8f%96/')
2:控制CSS的页面:限制图片的加载,如果不需要抓取网页上的图片,最好可以禁止图片的加载,这可以提高爬虫的效率。(图片相对于文字等其他文件内存较大,加载图片的时间较长)代码如下:
from selenium import webdriver
fp=webdriver.FirefoxProfile()#设定不加载css
fp.set_preference('permissions.default.img',2)
driver=webdriver.Firefox(firefox_profile=fp,executable_path=r'D:\幻想星风\Python\geckodriver.exe')
driver.get('http://www.santostang.com/2018/07/15/4-3-%e9%80%9a%e8%bf%87selenium-%e6%a8%a1%e6%8b%9f%e6%b5%8f%e8%a7%88%e5%99%a8%e6%8a%93%e5%8f%96/')
关注我(微信公众号搜索:幻想星风),获取更多小技能!