动态网页的爬取
有些网页的内容是动态加载的,这时候使用request去获得html文档会发现没有自己想要的内容。
介绍selenium:
一个可以模仿你使用浏览器的库,可以模仿一些人为的操作。比如输入账号,密码。滑动滚轮等。这里使用chrome做例子(也可以用其他浏览器)。
首先:你需要下载对应的浏览器和驱动器,chrome驱动器下载地址:http://npm.taobao.org/mirrors/chromedriver/
其次:你需要将下载的 chromedriver.exe 放到你的python同目录下,同时复制一份放在你的chrome浏览器的同目录下,并且配置好环境变量。
这里以某动态网页做例子:
from selenium.webdriver.chrome.options import Options
from selenium import webdriver
import urllib.request
url = "https://www.huashi6.com/rank" # 该网页是一个动态网页,有很多图片,使用request拿不到图片的地址,因为图片是动态加载的,只有下滑才能显示出来
image_urls = []
c_options = Options()
# c_options.add_argument("-headless") # 该代码可使你的网页打开时自己看不到,不写该代码你会看见自动打开的网页
c_options.add_argument("-disable-gpu")
t_1 = webdriver.Chrome(options=c_options) # 打开浏览器
t_1.get(url) # 打开网页
t_1.maximize_window() # 窗口最大化
js = "return action=document.body.scrollHeight"
new_height = t_1.execute_script(js) # 获得网页的高,单位px
for i in range(0, new_height+2000, 200): # 每次向下划动200像素
t_1.execute_script('window.scrollTo(0, %s)' % i)
time.sleep(1) # 可以等待一秒,让网页加载
# ------------------------------------------------------ 结束后网页就被拉到最底,这时所有的图片都被加载出来了
attrs = t_1.find_elements_by_xpath('//*[@id="app"]/div[2]/div[1]//img') # 获得图片所在的元素
for i in attrs:
image_urls.append(i.get_attribute('src')) # 遍历元素,将图片的地址取出
for i in range(0, len(image_urls)):
response = urllib.request.urlopen(i) # 这时再用request打开每张图片地址
file = open("image"+str[i+1]+".png","wb") # 打开文件,保存到本地,以png格式保存,由于是图片,需要以二进制方式打开
file.write(response.read()) # 写入时不需要解码
file.close() # 关闭文件
可在本地获得如下图片
总结:
selenium除了做这些简单的操作,还可以模仿登录,模仿鼠标的拖动等,但是它的弊端也很明显,就是爬取速度太慢。
不论是怎么爬取,都是1,获取数据。2,查找数据。3,保存数据等几步骤完成的。也就是说本质上能拿到网页的html的文档就可以爬取数据。
比如再linux下使用curl命令加上正则表达式,用一条命令即可爬取到数据。