zoukankan      html  css  js  c++  java
  • 利用Python3的requests和re库爬取猫眼电影笔记

         以下笔记,作为参考借鉴,如有疑问可以联系我进行交流探讨!

       代码思路很简单,简单概括为:
       首先利用requests的get方法获取页面的html文件,之后对得到的html文件进行相对应的正则处理,然后把爬取到的数据保存到本地。

    # -*- coding: utf-8 -*-
    """
    爬取的相关信息有:电影名次、电影名称、主演、上映时间、评分
     
    """
     
    import re
    import time
    import requests
    from multiprocessing import Pool
    from http.cookiejar import CookieJar
    from requests.exceptions import RequestException
     
    #创建requests回话
    s = requests.Session()
    #对需要登录或者需要利用cookie登录的,可以使用CookieJar( )这个方法。
    s.cookies = CookieJar()
     
    #创建个头文件,里面的用户我习惯使用这个"Baiduspider+"。
    header = {
        'user-agent': 'Baiduspider+',
    }
     
    #根据url获取HTML文件
    def getHTML(url, code='utf-8'):
        try:
            response = s.get(url, headers=header)
            response.raise_for_status()
            response.encoding = code
            return response.text
        except RequestException:
            print('getHTML Error')
     
    #对HTML进行正则表达式处理
    def parseHTML(html):
        pattern = re.compile('.*?board-index-.*?">(.*?)</i>.*?class="name">.*?'
                             + '"boarditem-click".*?"{movieId:.*?}">+(.*?)</a>.*?class="star">'
                             + '(.*?)</p>.*?class="releasetime">(.*?)</p>.*?<p class="score">'
                             + '<i class="integer">(.*?)</i><i class="fraction">(.*?)</i></p>', re.S)
     
     #需要把html字符串化,否则报错:TypeError: expected string or bytes-like object
        items = re.findall(pattern, str(html)) 
     
        for item in items:
            yield {
                '序号': item[0],
                '电影名': item[1],
                '主演': item[2].strip(),
                '上映时间': item[3],
                '评分': item[4] + item[5],
            }
     
    #把数据保存到本地
    def writePAGE(content):
        with open('result.txt', 'a' ) as f:
            f.write(str(content) + '
    ')
            f.close()
     
    #编写主函数
    def main(page):
        url = 'https://maoyan.com/board/4?offset=' + str(page)
        html = getHTML(url)
        items = parseHTML(html)
     
        for item in items:
            print(item)
            writePAGE(item)
     
     
    if __name__ == '__main__':
        start = time.time()
     
    #多进程爬取
        pool = Pool()
        pool.map(main, [page * 10 for page in range(10)])
        pool.close()  # 关闭进程池,不接受新的进程
        pool.join()  # 主进程阻塞等待子进程的退出
     
        end = time.time()
    #打印出最后运行的时间
        print('It spends %s s' % (end - start))
    

      

  • 相关阅读:
    Cannot load php5apache2_4.dll into server
    goroutine,channel
    为什么 Go 标准库中有些函数只有签名,没有函数体?
    PHP编码风格规范
    etcd压测造成数据目录过大恢复
    高可用kubernetes集群查看kube-scheduler和kube-controller-manager哪个是leader节点
    kubeadm join添加节点,新加节点夯在not ready(cni config uninitialized)
    一次.dockerignore设置错误导致的docker build排查
    通过开源插件实现sonarqube区分不同分支显示代码扫描结果
    python脚本,调用接口清理镜像多余tag
  • 原文地址:https://www.cnblogs.com/68xi/p/9294359.html
Copyright © 2011-2022 走看看