03Request爬取豆瓣电影信息及selenium请求库

昨日回顾

一、爬虫基本原理

-爬虫全过程

1.发送请求

2.接受相应数据

3.解析并提取有价值的消息

4.保存数据

二、Requests请求库

-get

​ url

​ headers

​ cookies

-post

​ url

​ headers

​ cookies

​ data

三、爬取校花网

1.通过主页解析提取详情页

2.通过详情页提取视频url

3.获取视频的二进制流写入本地

四、自动登陆GitHub

1.分析请求体信息

-用户名

-密码

-token

-杂七杂八

2.token

通过对login页面的解析提取

3.对session页面发送请求

-headers:

​ -User-Agent

-cookies

​ -login页面的cookie

-data

​ -form data

今日内容:

一、Request爬取豆瓣电影信息

-url:https://movie.douban.com/top250

-请求方式:get

-请求头:

user-agent

cookies

爬取的信息:

电影名称、电影url、电影导演、电影主演、电影年份、

电影类型、电影评分、电影评价、电影简介

分析所有主页的url

第一页:

<https://movie.douban.com/top250?start=0&filter=>

第二页:

https://movie.douban.com/top250?start=25&filter=

...

可以看出规律

用代码写出不同页数的url

num = 0
for line in range(10):
    url = f'https://movie.douban.com/top250?start={num}&filter='
    num += 25

get_page函数发送请求

def get_page(url):
    response=requests.get(url)
    print(response.text)
    return response

先找出豆瓣有关信息的dom

                        <div class="item">
                <div class="pic">
                    <em class="">1</em>
                    <a href="https://movie.douban.com/subject/1292052/">
                        <img width="100" alt="肖申克的救赎" src="https://img3.doubanio.com/view/photo/s_ratio_poster/public/p480747492.webp" class="">
                    </a>
                </div>
                <div class="info">
                    <div class="hd">
                        <a href="https://movie.douban.com/subject/1292052/" class="">
                            <span class="title">肖申克的救赎</span>
                                    <span class="title">&nbsp;/&nbsp;The Shawshank Redemption</span>
                                <span class="other">&nbsp;/&nbsp;月黑高飞(港)  /  刺激1995(台)</span>
                        <span class="playable">[可播放]</span>
                </div>
                <div class="bd">
                    <p class="">
                        导演: 弗兰克·德拉邦特 Frank Darabont&nbsp;&nbsp;&nbsp;主演: 蒂姆·罗宾斯 Tim Robbins /...<br>
                        1994&nbsp;/&nbsp;美国&nbsp;/&nbsp;犯罪 剧情
                    </p>
                             <div class="star">
                            <span class="rating5-t"></span>
                            <span class="rating_num" property="v:average">9.6</span>
                            <span property="v:best" content="10.0"></span>
                            <span>1468896人评价</span>
                    </div>

                        <p class="quote">
                            <span class="inq">希望让人自由。</span>
                        </p>
                </div>
            </div>
        </div>

用正则表达式匹配

<div class="item">.*?<em class="">(.*?)</em>.*?<a href="(.*?)">.*?<span class="title">(.*?)</span>.*?导演: (.*?)主演: (.*?)<br>(.*?)</p>.*?<span class="rating_num" .*?>(.*?)</span>.*?<span>(.*?)人评价</span>.*?<span class="inq">(.*?)</span>

pare_index函数解析页面


def pare_index(html):
    # 正则表达式

    movie_list = re.findall('<div class="item">.*?<em class="">(.*?)</em>.*?<a href="(.*?)">.*?<span class="title">(.*?)</span>.*?导演: (.*?)主演: (.*?)<br>(.*?)</p>.*?<span class="rating_num" .*?>(.*?)</span>.*?<span>(.*?)人评价</span>.*?<span class="inq">(.*?)</span>',
                            html,
                            re.S)
    return movie_list

save_data函数保存数据

# 3、保存数据
def save_data(movie):
    # 电影排名、电影url、电影名称、电影导演、电影主演
    # 电影年份 / 电影类型、电影评分、电影评论、电影简介
    top, m_url, name, daoyan, actor, year_type, \
    point, commit, desc = movie
    year_type = year_type.strip('\n')
    data = f'''
                ======== 欢迎尊敬官人观赏 ========
                        电影排名:{top}
                        电影url:{m_url}
                        电影名称:{name}
                        电影导演:{daoyan}
                        电影主演:{actor}
                        年份类型:{year_type}
                        电影评分:{point}
                        电影评论:{commit}
                        电影简介:{desc}
                ======== 请官人下次再来哟 ========
                \n
                \n
                '''
    print(data)

    with open('douban_top250.txt', 'a', encoding='utf-8') as f:
        f.write(data)

    print(f'电影: {name} 写入成功...')

二、selenium请求库

1、selenium是什么?

  selenium最初是一个自动化测试工具,而爬虫中使用它主要是为了解决requests无法执行javaScript代码的问题。原理是驱动浏览器执行一些一定好的操作。爬虫本质上就是模拟浏览器,所以可以用它来做爬虫

2.为什么要使用selenium

优点:

-执行js代码

-不需要分析复杂的通信流程

-对浏览器做弹窗、下拉操作

-******获取动态数据

-*****破解登陆验证

缺点:

-执行效率低

3.安装与使用

3.1安装selenium请求库

pip3 install selenium

3.2必须安装chrome浏览器

3.3安装浏览器驱动

3.4示例:搜索京东商品

from selenium import webdriver
from selenium.webdriver.common.by import By #按照什么方式查找,By.Id,By.CSS_SELECTOR
from selenium.webdriver.common.keys import Keys #键盘按键操作
from selenium.webdriver.support import expected_conditions as EC #和下面WebDriverWait一起用的
from selenium.webdriver.support.wait import WebDriverWait #等待页面加载某些元素

import time
#方式一:通过驱动打开浏览器
driver = webdriver.Chrome(r'C:\Program Files (x86)\chromedriver.exe')

# 方式二:把webdriver.exe驱动放到python解释器安装目录/Scripts文件夹中
#python解释器安装目录/Scripts配置环境变量
#python解释器安装目录 配置环境变量
try:
    driver.get("https://www.jd.com/")

    # 获取显式等待对象10秒
    # 可以等待某个标签加载10秒
    wait = WebDriverWait(driver,10)
    # 查找元素id为key
    input_tag = wait.until(EC.presence_of_element_located(
        (By.ID, 'key')
    ))
    time.sleep(5)
    #在输入框输入商品名称

    input_tag.send_keys('苹果')

    #按下回车

    input_tag.send_keys(Keys.ENTER)

    time.sleep(20)
finally:
    # 关闭浏览器
    driver.close()

3.5示例二:自动登入百度

''''''
from selenium import webdriver  # web驱动
from selenium.webdriver.common.keys import Keys  # 键盘按键操作
import time

driver = webdriver.Chrome()

try:

    # 隐式等待: 需要在get之前调用
    # 等待任意元素加载10秒
    driver.implicitly_wait(10)

    driver.get('https://www.baidu.com/')

    # 显式等待: 需要在get之后调用
    time.sleep(5)

    '''
    ===============所有方法===================
        element是查找一个标签
        elements是查找所有标签
    '''
    # 自动登录百度 start
    # 1、find_element_by_link_text # 通过链接文本去找
    login_link = driver.find_element_by_link_text('登录')
    login_link.click()  # 点击登录

    time.sleep(1)

    # 2、find_element_by_id # 通过id去找
    user_login = driver.find_element_by_id('TANGRAM__PSP_10__footerULoginBtn')
    user_login.click()

    time.sleep(1)

    # 3、find_element_by_class_name
    user = driver.find_element_by_class_name('pass-text-input-userName')
    user.send_keys('*****')

    # 4、find_element_by_name
    pwd = driver.find_element_by_name('password')
    pwd.send_keys('*****')

    submit = driver.find_element_by_id('TANGRAM__PSP_10__submit')
    submit.click()
    # end

    # 5、find_element_by_partial_link_text
    # 局部链接文本查找
    login_link = driver.find_element_by_partial_link_text('登')
    login_link.click()

    # 6、find_element_by_css_selector
    # 根据属性选择器查找元素
    # .: class
    # #: id
    login2_link = driver.find_element_by_css_selector('.tang-pass-footerBarULogin')
    login2_link.click()

    # 7、find_element_by_tag_name
    div = driver.find_elements_by_tag_name('div')
    print(div)


    time.sleep(20)

finally:
    # 关闭浏览器释放操作系统资源
    driver.close()
posted @ 2019-07-02 14:13  Crystal_Zh  阅读(416)  评论(0编辑  收藏  举报