系列文章目录
提示:
爬虫学习笔记(四)——糗百爬虫遇到的反爬
爬虫学习笔记(三)——利用JSON爬取豆瓣热映的使用
爬虫学习笔记(二):requests基础用法之爬取各类主流网站2
爬虫学习笔记(一):requests基础用法之爬取各类主流网站1
前言
Selenium是一款用于测试Web应用程序的经典工具。它直接运行在浏览器中,主要用于网站自动化测试、网站模拟登陆、自动操作键盘和鼠标、测试网站功能等,同时也可以用来制作网络爬虫。目前由于版本的更新,新版的selenium已经放弃了对于PhantomJS的支持,建议使用chrome,火狐浏览器执行。一、Selenium是什么?
Selenium是一款用于测试Web应用程序的经典工具。
二、使用步骤
1.引入库
使用之前,需要下载对应浏览器的driver放置于python运行的目录下才能使用该浏览器。代码如下,使用的是chrome浏览器(示例):
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
driver = webdriver.Chrome()
2.读入数据
代码如下(示例):
driver.get('https://movie.douban.com/top250?')
类似于requests模块的get命令。
3.selenium与传统爬虫的区别
由于我们以往使用request+xpath的爬虫主要面对静态页面,对于页面中有JS生成的内容则无能为力。而这些数据如果通过json进行查找页面也很困难。在这种情况下,利用selenium生成的浏览器环境可以自动运行 JS 文件,所以不用担心JS文件生成无法进行爬取的情况。
3.1 request爬虫复习
今天我们要爬取的url地址是:https://i.maoyan.com/asgard/board ,下面利用我们之前所学的request模块爬取整个静态页面,并保存为一个html文件。
# -*- coding: utf-8 -*-
import requests
import time
headers={'User-Agent':'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Mobile Safari/537.36'}
from requests.exceptions import RequestException
def get_one_page(url,headers):
try:
response = requests.get(url,headers=headers)
if response.status_code == 200:
return response.content.decode("utf-8")
except RequestException:
time.sleep(5)
def saveHtml(file_name, file_content):
# 注意windows文件命名的禁用符,比如 /
with open(file_name.replace('/', '_') + ".html", "w",encoding="utf-8") as f:
# 写文件用bytes而不是str,所以要转码
f.write(file_content)
def main():
url = "https://i.maoyan.com/asgard/board"
html = get_one_page(url,headers)
print(html)
h=saveHtml('htmlview',html)
print(h)
# data = html.replace('<!--', '').replace('-->', '')
if __name__ == '__main__':
main()
爬取完成后,可以发现在pycharm查看到静态页面的内容包括电影名称,演员等内容,但是保存为html文件里面的内容丢失了。这是因为这部分数据是通过JS动态加载的,后面利用xpath或者lxml都无法直接爬取这些页面的文字内容。
3.2 selenium爬虫的简单实现
下面,我们利用上面学到的知识,利用selenium爬取这个页面,主要保存电影名称和主演的信息,并通过字典格式保存下来。在寻找元素定位我们使用了selenium模块中的find_element_by_xpath。这里需要注意的是element要加s,不然程序会报错。
# -*- coding: utf-8 -*-
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
driver = webdriver.Chrome()
try:
driver.get('https://i.maoyan.com/asgard/board')
moviename = driver.find_elements_by_xpath("//*[@class='movie-nm']")
moviestar = driver.find_elements_by_xpath("//*[@class='movie-star']")
# for t in moviename:
# print(t.text)
# for t in moviestar:
# print(t.text)
elem_dic = dict(zip(moviename,moviestar))
print(type(elem_dic))
time.sleep(1)
for key in elem_dic:
print(key.text,elem_dic[key].text)
finally:
driver.close()
driver.quit()
爬取结果如下:
<class ‘dict’>
误杀2 肖央 / 任达华 / 文咏珊
穿过寒冬拥抱你 黄渤 / 贾玲 / 朱一龙
以年为单位的恋爱 毛晓彤 / 杨玏 / 孙千
反贪风暴5:最终章 古天乐 / 张智霖 / 郑嘉颖
平原上的火焰 周冬雨 / 刘昊然 / 梅婷
李茂换太子 马丽 / 常远 / 艾伦
毒液2 汤姆·哈迪 / 伍迪·哈里森 / 诹访部顺一
超能一家人 艾伦 / 沈腾 / 陶慧
爱情神话 徐峥 / 马伊琍 / 吴越
四海 刘昊然 / 刘浩存 / 沈腾
下面,我们继续爬取,这次目标换成了豆瓣电影top250,页面的url地址:https://movie.douban.com/top250? ,我们这次爬取电影的排名和名称,用列表的格式输出。
# -*- coding: utf-8 -*-
import requests
from selenium import webdriver
import time
# from selenium.webdriver.common.by import By
# from selenium.webdriver.common.keys import Keys
# from selenium.webdriver.support import expected_conditions as EC
# from selenium.webdriver.support.wait import WebDriverWait
driver = webdriver.Chrome()
try:
driver.get('https://movie.douban.com/top250?')
li_list = driver.find_elements_by_xpath('//*[@id="content"]/div/div[1]/ol/li')
# moviename = driver.find_elements_by_xpath("//*/div[@class='movie-info']")
contents = []
for i in li_list:
# 排名
rank = i.find_element_by_xpath('./div/div[1]/em').text
# 电影名称
name = i.find_element_by_xpath('./div/div[2]/div[1]/a/span[1]').text
contents = [rank,name]
#注意上面用elements 下面for i in 语句用element,不带S
print(contents)
finally:
driver.close()
driver.quit()