爬虫笔记(七)——利用selenium对猫眼、豆瓣电影榜单的爬取

系列文章目录

提示:
爬虫学习笔记(四)——糗百爬虫遇到的反爬
爬虫学习笔记(三)——利用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都无法直接爬取这些页面的文字内容。
pycharm里面显示爬取到的文本内容

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()
  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值