zoukankan      html  css  js  c++  java
  • python豆瓣的简单爬虫

    https://movie.douban.com/

    直奔主题,给个要爬取的豆瓣电影地址,爬取热门电影名字。

    右键选择查看网页源码,我们可以发现在网页静态源码里,是找不到‘来电狂想’这些关键字的。

    通过检查网页,查看network下的XHR,我们可以找到对应的信息。说明我们想要爬取的这部分内容是通过Ajax从后台拿到的json数据。

    copy link address得到访问的url:https://movie.douban.com/j/search_subjects?type=movie&tag=%E7%83%AD%E9%97%A8&page_limit=50&page_start=0

    分析url,传入的参数:

    {'type': 'movie', 'tag': '热门', 'page_limit': 50, 'page_start': 0}  # 数据类型是电影,标签是热门,返回数据总数50条,数据起始位置第0条

    于是我们就可以写个脚本,将0-50条json数据里title字段的值(热门电影的名字)爬取下来。

    from urllib.parse import urlencode
    from urllib.request import urlopen, Request
    import simplejson
    import ssl
    
    # 伪装成浏览器
    ua = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'
    base_url = 'https://movie.douban.com/j/search_subjects'
    d = {
        'type': 'movie',
        'tag': '热门',
        'page_limit': 50,
        'page_start': 0
    }
    
    # ssl验证问题:忽略不信任的证书。就可以访问该网站
    context = ssl._create_unverified_context()
    
    # url编码后,传入Request()函数;headers参数伪装浏览器
    req = Request('{}?{}'.format(base_url, urlencode(d)), headers={'User-agent': ua})
    
    with urlopen(req, context=context) as res:
        res = simplejson.loads(res.read())  # json转dict
    
        for subject in res['subjects']:
            print(subject['title'])  # 取出电影名字
            with open('douban.txt', 'a') as f:
                f.write(subject['title'] + '
    ')

      

    部分结果:

    小偷家族
    蜘蛛侠:平行宇宙
    三次元女友
    悠哉日常大王剧场版:假期活动
    独家记忆番外之相信爱
    波西米亚狂想曲
    白蛇:缘起
    谁先爱上他的
    “大”人物
    无敌破坏王2:大闹互联网
    来电狂响
    神奇动物:格林德沃之罪
    无名之辈
    毒液:致命守护者

    写到这里还有一个小知识点想记录一下。就是爬虫中最常见遇到的有SSL导致的‘urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:833)’错误。

    其实也就是https的问题:

    HTTP(HyperText Transfer Protocol)超文本传输协议是浏览器和服务器之间传递信息的一种协议。HTTP以明文的方式发送信息,不进行任何的加密。所以如果攻击者截取了浏览器和服务器之间的报文,就可以直接获得其中的信息,如果里面包含了用户名、密码、银行卡号等敏感信息就很不安全了。

    HTTPS(Hypertext Transfer Protocol Secure)超文本传输安全协议在HTTP基础上加入了SSL(Secure Sockets Layer)协议构建的可进行加密传输、身份验证的网络协议,来保证数据的安全。

    HTTPS通过两种方法保证数据安全:

    1.建立一个信息安全通道,来保证数据传输的安全

    2.确认网站的真实性

    https http
    需要CA(Cerfificate Authority)申请证书,需要一定费用 不需要CA证书
    ssl加密传输 信息是明文传输
    连接端口:443 连接端口:80

    https工作原理:

    1.客户端发起HTTPS请求(浏览器输入一个https网址,连接到服务器的443端口);

    2.服务器端的配置(采用HTTPS协议的服务器必须有一套数字证书(一对公钥和私钥),可以自己制作(自己颁发的证书需要客户端验证通过),可以向组织申请(CA:发放、管理、废除数字证书的机构));

    3.传送证书(公钥:包含证书颁发机构、过期时间等信息);

    4.客户端解析证书(由客户端的TLS完成:验证公钥是否有效,如果发现异常,会弹出一个警告框,提示证书存在问题;如果没有问题,就会生成一个随机值,然后用证书对随机值加密);

    5.客户端传送加密信息(传送证书加密后的随机值,让服务器端得到这个随机值。以后客户端和服务器端的通信就是通过这个随机值进行加密解密);

    6.服务器端解密信息(服务器端用自己的私钥解密后,得到客户端传来的随机值(私钥)。然后内容通过该随机值(私钥)进行对称加密);

    7.服务器端向客户端传输加密后的信息(这部分信息为步骤6中通过随机值进行加密的内容);

    8.客户端解密信息(客户端通过该随机值对信息进行解密。所以整个过程即使被第三方监听到,也无法获取明文信息)。

    爬虫时,会遇到因为https的ssl验证问题导致网站访问不了,通常的解决办法是在代码里忽略不信任的证书:

    import ssl
    
    url = 'https://12306.cn/index/
    context = ssl._create_unverified_context()
    res = urlopen(url, context=context)  # 忽略不信任的证书就可以正常访问了
  • 相关阅读:
    Oracle 11 安装 提示环境不满足最低要求解决方案
    sys.argv[]的用法简明解释
    (转载)Pycharm 新版本打开md文件卡死-解决办法
    csv模块
    算法笔记——【动态规划】矩阵连乘问题——备忘录法
    Clion配置MingGW报错test cmake run with errors解决方法
    主定理(Master Theorem)与时间复杂度的计算
    UML笔记
    分治法+时间复杂度分析
    数字图像处理DIP 学习笔记
  • 原文地址:https://www.cnblogs.com/hongdanni/p/10486274.html
Copyright © 2011-2022 走看看