赞
踩
提示:
爬虫学习笔记(四)——糗百爬虫遇到的反爬
爬虫学习笔记(三)——利用JSON爬取豆瓣热映的使用
爬虫学习笔记(二):requests基础用法之爬取各类主流网站2
爬虫学习笔记(一):requests基础用法之爬取各类主流网站1
Selenium是一款用于测试Web应用程序的经典工具。
使用之前,需要下载对应浏览器的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()
代码如下(示例):
driver.get('https://movie.douban.com/top250?')
类似于requests模块的get命令。
由于我们以往使用request+xpath的爬虫主要面对静态页面,对于页面中有JS生成的内容则无能为力。而这些数据如果通过json进行查找页面也很困难。在这种情况下,利用selenium生成的浏览器环境可以自动运行 JS 文件,所以不用担心JS文件生成无法进行爬取的情况。
今天我们要爬取的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都无法直接爬取这些页面的文字内容。
下面,我们利用上面学到的知识,利用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()
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。