Day02 requests爬取豆瓣电影信息及selenium请求库

时间:2021-10-20 12:24:39
昨日回顾:
一 爬虫基本原理
- 爬虫全过程
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_url发送请求
- headers:
- user-agent

- cookies:
- login页面的cookies
- data:
- form_data

今日内容
一 requests爬取豆瓣电影信息
- 请求url
https://movie.douban.com/top250
- 请求方式
GET
- 请求头
User-Agent
cookies
""""""
"""
爬取豆瓣电影信息:
    电影排名、电影名称、电影url、电影导演
    电影主演、电影年份、电影类型
    电影评分、电影评论、电影简介
1.分析所有主页的url
第一页:https://movie.douban.com/top250?start=0&filter=
第二页:https://movie.douban.com/top250?start=25&filter=
第三页:https://movie.douban.com/top250?start=50&filter=
"""
import requests
import re
# 爬虫三部曲
# 1.发送请求
def get_page(url):
    response=requests.get(url)
    # print(response.text)
    return response
# 2.解析数据
def parse_index(html):
   """"""
   """
    电影排名、电影url、电影名称、电影导演、电影主演
    电影年份/电影类型、电影评分、电影评论、电影简介
    <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>
    <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>
    """
   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
# 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.txt','a',encoding='utf-8') as f:
        f.write(data)
    print(f'电影{name}写入成功...')
if __name__ == '__main__':
    # 拼接所有主页
    num = 0
    for line in range(10):
        url=f'https://movie.douban.com/top250?start={num}&filter='
        num+=25
        print(url)
        # 1.往每个主页发送请求
        index_res=get_page(url)
        # 2.解析主页获取电影信息
        movie_list=parse_index(index_res.text)
        for movie in movie_list:
            # print(movie)
        # 3.保存数据
            save_data(movie)

 



二 selenium请求库
1、什么是selenium?
起初是一个自动化测试工具,原理是驱动浏览器执行一些一定好的操作。
爬虫本质上就是模拟浏览器,可以使用它来做爬虫。
2、为什么要使用selenium?
优点:
- 执行js代码
- 不需要分析复杂的通信流程
- 可以对浏览器做弹窗、下拉等操作
- ***** 获取动态数据
- *** 破解登录验证
缺点:
- 执行效率低
3、安装与使用
1.安装selenium请求库:
pip3 install selenium
2.必须安装浏览器
谷歌 或 火狐
3.安装浏览器驱动

from selenium import webdriver   # web驱动
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
import time
# 方式一:通过驱动打开浏览器
# driver = webdriver.Chrome(r'D:\test\webdriver.exe')
# 方式二:把webdriver.exe驱动放到 python解释器目录/scripts文件夹中
# driver = webdriver.Chrome(r'D:\test\webdriver.exe')
driver = webdriver.Chrome()
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()
''''''
from selenium import webdriver  # web驱动
from selenium.webdriver.common.keys import Keys  # 键盘按键操作
import time
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()