精华内容
参与话题
问答
  • Python爬虫入门项目

    万次阅读 多人点赞 2017-12-25 16:26:21
    Python是什么 Python是著名的“龟叔”Guido van Rossum在1989年圣诞节期间,为了打发无聊的圣诞节而编写的一个编程语言。 创始人Guido van Rossum是BBC出品英剧Monty Python’s Flying Circus(中文:蒙提·派森的...

    Python是什么

    Python是著名的“龟叔”Guido van Rossum在1989年圣诞节期间,为了打发无聊的圣诞节而编写的一个编程语言。

    创始人Guido van Rossum是BBC出品英剧Monty Python’s Flying Circus(中文:蒙提·派森的飞行马戏团)的狂热粉丝,因而将自己创造的这门编程语言命名为Python。

    人生苦短,我用python,翻译自"Life is short, you need Python"

    Python英式发音:/ˈpaɪθən/ ,中文类似‘拍森’。而美式发音:/ˈpaɪθɑːn/,中文类似‘拍赏’。我看麻省理工授课教授读的是‘拍赏’,我觉得国内大多是读‘拍森’吧。

    2017年python排第一也无可争议,比较AI第一语言,在当下人工智能大数据大火的情况下,python无愧第一语言的称号,至于C、C++、java都是万年的老大哥了,在代码量比较方面,小编相信java肯定是完爆其它语言的。

    不过从这一年的编程语言流行趋势看,java依然是传播最多的,比较无论app、web、云计算都离不开,而其相对python而言,学习路径更困难一点,想要转行编程,而且追赶潮流,python已然是最佳语言。

    许多大型网站就是用Python开发的,国内:豆瓣、搜狐、金山、腾讯、盛大、网易、百度、阿里、淘宝、热酷、土豆、新浪、果壳…; 国外:谷歌、NASA、YouTube、Facebook、工业光魔、红帽…

    Python将被纳入高考内容

    浙江省信息技术课程改革方案已经出台,Python确定进入浙江省信息技术高考,从2018年起浙江省信息技术教材编程语言将会从vb更换为Python。其实不止浙江,教育大省北京和山东也确定要把Python编程基础纳入信息技术课程和高考的内容体系,Python语言课程化也将成为孩子学习的一种趋势。尤其山东省最新出版的小学信息技术六年级教材也加入了Python内容,小学生都开始接触Python语言了!!

    再不学习,又要被小学生完爆了。。。

     

    Python入门教程

    Python能做什么

    • 网络爬虫
    • Web应用开发
    • 系统网络运维
    • 科学与数字计算
    • 图形界面开发
    • 网络编程
    • 自然语言处理(NLP)
    • 人工智能
    • 区块链
    • 多不胜举。。。

    Python入门爬虫

    这是我的第一个python项目,在这里与大家分享出来~

    • 需求
      • 我们目前正在开发一款产品其功能大致是:用户收到短信如:购买了电影票或者火车票机票之类的事件。然后app读取短信,解析短信,获取时间地点,然后后台自动建立一个备忘录,在事件开始前1小时提醒用户。
    • 设计
      • 开始我们将解析的功能放在了服务端,但是后来考虑到用户隐私问题。后来将解析功能放到了app端,服务端只负责收集数据,然后将新数据发送给app端。
      • 关于服务端主要是分离出两个功能,一、响应app端请求返回数据。二、爬取数据,存入数据库。
      • 响应请求返回数据使用java来做,而爬取数据存入数据库使用python来做,这样分别使用不同语言来做是因为这两种语言各有优势,java效率比python高些,适合做web端,而爬取数据并不是太追求性能且python语言和大量的库适合做爬虫。
    • 代码
      • 本项目使用python3的版本
      • 获取源码:扫描下方关注微信公众号「裸睡的猪」回复:爬虫入门 获取
         

         

      • 了解这个项目你只需要有简单的python基础,能了解python语法就可以。其实我自己也是python没学完,然后就开始写,遇到问题就百度,边做边学这样才不至于很枯燥,因为python可以做一些很有意思的事情,比如模拟连续登录挣积分,比如我最近在写一个预定模范出行车子的python脚本。推荐看廖雪峰的python入门教程
      • 首先带大家看看我的目录结构,开始我打算是定义一个非常好非常全的规范,后来才发现由于自己不熟悉框架,而是刚入门级别,所以就放弃了。从简而入:
      • 下面咱们按照上图中的顺序,从上往下一个一个文件的讲解init.py包的标识文件,python包就是文件夹,当改文件夹下有一个init.py文件后它就成为一个package,我在这个包中引入一些py供其他py调用。

    init.py

    # -*- coding: UTF-8 -*-  
    
    # import need manager module  
    import MongoUtil  
    import FileUtil  
    import conf_dev  
    import conf_test  
    import scratch_airport_name  
    import scratch_flight_number  
    import scratch_movie_name  
    import scratch_train_number  
    import scratch_train_station  
    import MainUtil
    

    下面两个是配置文件,第一个是开发环境的(windows),第二个是测试环境的(linux),然后再根据不同系统启用不同的配置文件

    conf_dev.py

    # -*- coding: UTF-8 -*-  
    # the configuration file of develop environment  
    
    # path configure  
    data_root_path = 'E:/APK98_GNBJ_SMARTSERVER/Proj-gionee-data/smart/data'  
    
    # mongodb configure  
    user = "cmc"  
    pwd = "123456"  
    server = "localhost"  
    port = "27017"  
    db_name = "smartdb"
    

    conf_test.py

    # -*- coding: UTF-8 -*-  
    # the configuration file of test environment  
    
    #path configure  
    data_root_path = '/data/app/smart/data'  
    
    #mongodb configure  
    user = "smart"  
    pwd = "123456"  
    server = "10.8.0.30"  
    port = "27017"  
    db_name = "smartdb"
    

    下面文件是一个util文件,主要是读取原文件的内容,还有将新内容写入原文件。

    FileUtil.py

    # -*- coding: UTF-8 -*-  
    import conf_dev  
    import conf_test  
    import platform  
    
    
    # configure Multi-confronment  
    # 判断当前系统,并引入相对的配置文件
    platform_os = platform.system()  
    config = conf_dev  
    if (platform_os == 'Linux'):  
        config = conf_test  
    # path  
    data_root_path = config.data_root_path  
    
    
    # load old data  
    def read(resources_file_path, encode='utf-8'):  
        file_path = data_root_path + resources_file_path  
        outputs = []  
        for line in open(file_path, encoding=encode):  
            if not line.startswith("//"):  
                outputs.append(line.strip('\n').split(',')[-1])  
        return outputs  
    
    
    # append new data to file from scratch  
    def append(resources_file_path, data, encode='utf-8'):  
        file_path = data_root_path + resources_file_path  
        with open(file_path, 'a', encoding=encode) as f:  
            f.write(data)  
        f.close
    

    下面这个main方法控制着执行流程,其他的执行方法调用这个main方法

    MainUtil.py

    # -*- coding: UTF-8 -*-  
    
    import sys  
    from datetime import datetime  
    import MongoUtil  
    import FileUtil  
    
    # @param resources_file_path 资源文件的path  
    # @param base_url 爬取的连接  
    # @param scratch_func 爬取的方法  
    def main(resources_file_path, base_url, scratch_func):  
        old_data = FileUtil.read(resources_file_path)   #读取原资源  
        new_data = scratch_func(base_url, old_data)     #爬取新资源  
        if new_data:        #如果新数据不为空  
            date_new_data = "//" + datetime.now().strftime('%Y-%m-%d') + "\n" + "\n".join(new_data) + "\n"      #在新数据前面加上当前日期  
            FileUtil.append(resources_file_path, date_new_data)     #将新数据追加到文件中  
            MongoUtil.insert(resources_file_path, date_new_data)    #将新数据插入到mongodb数据库中  
        else:   #如果新数据为空,则打印日志  
            print(datetime.now().strftime('%Y-%m-%d %H:%M:%S'), '----', getattr(scratch_func, '__name__'), ": nothing to update ")
    

    将更新的内容插入mongodb中

    MongoUtil.py

    # -*- coding: UTF-8 -*-  
    
    import platform  
    from pymongo import MongoClient  
    from datetime import datetime, timedelta, timezone  
    import conf_dev  
    import conf_test  
    
    # configure Multi-confronment  
    platform_os = platform.system()  
    config = conf_dev  
    if (platform_os == 'Linux'):  
        config = conf_test  
    # mongodb  
    uri = 'mongodb://' + config.user + ':' + config.pwd + '@' + config.server + ':' + config.port + '/' + config.db_name  
    
    
    # 将数据写入mongodb  
    # @author chenmc  
    # @param uri connect to mongodb  
    # @path save mongodb field  
    # @data save mongodb field  
    # @operation save mongodb field default value 'append'  
    # @date 2017/12/07 16:30  
    # 先在mongodb中插入一条自增数据 db.sequence.insert({ "_id" : "version","seq" : 1})  
    
    def insert(path, data, operation='append'):  
        client = MongoClient(uri)  
        resources = client.smartdb.resources  
        sequence = client.smartdb.sequence  
        seq = sequence.find_one({"_id": "version"})["seq"]      #获取自增id  
        sequence.update_one({"_id": "version"}, {"$inc": {"seq": 1}})       #自增id+1  
        post_data = {"_class": "com.gionee.smart.domain.entity.Resources", "version": seq, "path": path,  
                     "content": data, "status": "enable", "operation": operation,  
                     "createtime": datetime.now(timezone(timedelta(hours=8)))}  
        resources.insert(post_data)     #插入数据
    

    项目引入的第三方库,可使用pip install -r requirements.txt下载第三方库

    requirements.txt

    # need to install module# need to install module  
    bs4  
    pymongo  
    requests  
    json
    

    下面真正的执行方法来了,这五个py分别表示爬取五种信息:机场名、航班号、电影名、列车号、列车站。他们的结构都差不多,如下:

    第一部分:定义查找的url;
    第二部分:获取并与旧数据比较,返回新数据;
    第三部分:main方法,执行写入新数据到文件和mongodb中;
    

    scratch_airport_name.py:爬取全国机场

    # -*- coding: UTF-8 -*-  
    import requests  
    import bs4  
    import json  
    import MainUtil  
    
    resources_file_path = '/resources/airplane/airportNameList.ini'  
    scratch_url_old = 'https://data.variflight.com/profiles/profilesapi/search'  
    scratch_url = 'https://data.variflight.com/analytics/codeapi/initialList'  
    get_city_url = 'https://data.variflight.com/profiles/Airports/%s'  
    
    
    #传入查找网页的url和旧数据,然后本方法会比对原数据中是否有新的条目,如果有则不加入,如果没有则重新加入,最后返回新数据
    def scratch_airport_name(scratch_url, old_airports):  
        new_airports = []  
        data = requests.get(scratch_url).text  
        all_airport_json = json.loads(data)['data']  
        for airport_by_word in all_airport_json.values():  
            for airport in airport_by_word:  
                if airport['fn'] not in old_airports:  
                    get_city_uri = get_city_url % airport['id']  
                    data2 = requests.get(get_city_uri).text  
                    soup = bs4.BeautifulSoup(data2, "html.parser")  
                    city = soup.find('span', text="城市").next_sibling.text  
                    new_airports.append(city + ',' + airport['fn'])  
        return new_airports  
    
     #main方法,执行这个py,默认调用main方法,相当于java的main
    if __name__ == '__main__':  
        MainUtil.main(resources_file_path, scratch_url, scratch_airport_name)
    

    scratch_flight_number.py:爬取全国航班号

    #!/usr/bin/python  
    # -*- coding: UTF-8 -*-  
    
    import requests  
    import bs4  
    import MainUtil  
    
    resources_file_path = '/resources/airplane/flightNameList.ini'  
    scratch_url = 'http://www.variflight.com/sitemap.html?AE71649A58c77='  
    
    
    def scratch_flight_number(scratch_url, old_flights):  
        new_flights = []  
        data = requests.get(scratch_url).text  
        soup = bs4.BeautifulSoup(data, "html.parser")  
        a_flights = soup.find('div', class_='list').find_all('a', recursive=False)  
        for flight in a_flights:  
            if flight.text not in old_flights and flight.text != '国内航段列表':  
                new_flights.append(flight.text)  
        return new_flights  
    
    
    if __name__ == '__main__':  
        MainUtil.main(resources_file_path, scratch_url, scratch_flight_number)
    

    scratch_movie_name.py:爬取最近上映的电影

    #!/usr/bin/python  
    # -*- coding: UTF-8 -*-  
    import re  
    import requests  
    import bs4  
    import json  
    import MainUtil  
    
    # 相对路径,也是需要将此路径存入数据库  
    resources_file_path = '/resources/movie/cinemaNameList.ini'  
    scratch_url = 'http://theater.mtime.com/China_Beijing/'  
    
    
    # scratch data with define url  
    def scratch_latest_movies(scratch_url, old_movies):  
        data = requests.get(scratch_url).text  
        soup = bs4.BeautifulSoup(data, "html.parser")  
        new_movies = []  
        new_movies_json = json.loads(  
            soup.find('script', text=re.compile("var hotplaySvList")).text.split("=")[1].replace(";", ""))  
        coming_movies_data = soup.find_all('li', class_='i_wantmovie')  
        # 上映的电影  
        for movie in new_movies_json:  
            move_name = movie['Title']  
            if move_name not in old_movies:  
                new_movies.append(movie['Title'])  
        # 即将上映的电影  
        for coming_movie in coming_movies_data:  
            coming_movie_name = coming_movie.h3.a.text  
            if coming_movie_name not in old_movies and coming_movie_name not in new_movies:  
                new_movies.append(coming_movie_name)  
        return new_movies  
    
    
    if __name__ == '__main__':  
        MainUtil.main(resources_file_path, scratch_url, scratch_latest_movies)
    

    scratch_train_number.py:爬取全国列车号

    #!/usr/bin/python  
    # -*- coding: UTF-8 -*-  
    import requests  
    import bs4  
    import json  
    import MainUtil  
    
    resources_file_path = '/resources/train/trainNameList.ini'  
    scratch_url = 'http://www.59178.com/checi/'  
    
    
    def scratch_train_number(scratch_url, old_trains):  
        new_trains = []  
        resp = requests.get(scratch_url)  
        data = resp.text.encode(resp.encoding).decode('gb2312')  
        soup = bs4.BeautifulSoup(data, "html.parser")  
        a_trains = soup.find('table').find_all('a')  
        for train in a_trains:  
            if train.text not in old_trains and train.text:  
                new_trains.append(train.text)  
        return new_trains  
    
    
    if __name__ == '__main__':  
        MainUtil.main(resources_file_path, scratch_url, scratch_train_number)
    

    scratch_train_station.py:爬取全国列车站

    #!/usr/bin/python  
    # -*- coding: UTF-8 -*-  
    import requests  
    import bs4  
    import random  
    import MainUtil  
    
    resources_file_path = '/resources/train/trainStationNameList.ini'  
    scratch_url = 'http://www.smskb.com/train/'  
    
    
    def scratch_train_station(scratch_url, old_stations):  
        new_stations = []  
        provinces_eng = (  
            "Anhui", "Beijing", "Chongqing", "Fujian", "Gansu", "Guangdong", "Guangxi", "Guizhou", "Hainan", "Hebei",  
            "Heilongjiang", "Henan", "Hubei", "Hunan", "Jiangsu", "Jiangxi", "Jilin", "Liaoning", "Ningxia", "Qinghai",  
            "Shandong", "Shanghai", "Shanxi", "Shanxisheng", "Sichuan", "Tianjin", "Neimenggu", "Xianggang", "Xinjiang",  
            "Xizang",  
            "Yunnan", "Zhejiang")  
        provinces_chi = (  
            "安徽", "北京", "重庆", "福建", "甘肃", "广东", "广西", "贵州", "海南", "河北",  
            "黑龙江", "河南", "湖北", "湖南", "江苏", "江西", "吉林", "辽宁", "宁夏", "青海",  
            "山东", "上海", "陕西", "山西", "四川", "天津", "内蒙古", "香港", "新疆", "西藏",  
            "云南", "浙江")  
        for i in range(0, provinces_eng.__len__(), 1):  
            cur_url = scratch_url + provinces_eng[i] + ".htm"  
            resp = requests.get(cur_url)  
            data = resp.text.encode(resp.encoding).decode('gbk')  
            soup = bs4.BeautifulSoup(data, "html.parser")  
            a_stations = soup.find('left').find('table').find_all('a')  
            for station in a_stations:  
                if station.text not in old_stations:  
                    new_stations.append(provinces_chi[i] + ',' + station.text)  
        return new_stations  
    
    
    if __name__ == '__main__':  
        MainUtil.main(resources_file_path, scratch_url, scratch_train_station)
    

    将项目放到测试服务器(centos7系统)中运行起来,我写了一个crontab,定时调用他们,下面贴出crontab。

    /etc/crontab

    SHELL=/bin/bash  
    PATH=/sbin:/bin:/usr/sbin:/usr/bin  
    MAILTO=root  
    
    # For details see man 4 crontabs  
    
    # Example of job definition:  
    # .---------------- minute (0 - 59)  
    # |  .------------- hour (0 - 23)  
    # |  |  .---------- day of month (1 - 31)  
    # |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...  
    # |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat  
    # |  |  |  |  |  
    # *  *  *  *  * user-name  command to be executed  
      0  0  *  *  * root python3 /data/app/smart/py/scratch_movie_name.py    >> /data/logs/smartpy/out.log 2>&1  
      0  1  *  *  1 root python3 /data/app/smart/py/scratch_train_station.py >> /data/logs/smartpy/out.log 2>&1  
      0  2  *  *  2 root python3 /data/app/smart/py/scratch_train_number.py  >> /data/logs/smartpy/out.log 2>&1  
      0  3  *  *  4 root python3 /data/app/smart/py/scratch_flight_number.py >> /data/logs/smartpy/out.log 2>&1  
      0  4  *  *  5 root python3 /data/app/smart/py/scratch_airport_name.py  >> /data/logs/smartpy/out.log 2>&1
    

    后续

    目前项目已经正常运行了三个多月啦。。。

    有问题反馈

    在阅读与学习中有任何问题,欢迎反馈给我,可以用以下联系方式跟我交流

    • 微信公众号:裸睡的猪
    • 在下面留言
    • 直接给我私信

    关于此公众号

    • 后期或提供各种软件的免费激活码
    • 推送python,java等编程技术文章和面试技巧
    • 当然你们可以将你们感兴趣的东西直接送给我
    • 谢谢你们真诚的关注,此公众号以后获得的收益将全部通过抽奖的形式送给大家
    • 以后如果博主要创业的话,也会在此公众号中挑选小伙伴哦~
    • 希望大家分享出去,让更多想学习python的朋友看到~

     

     

    展开全文
  • Python爬虫入门

    千次阅读 多人点赞 2018-05-31 16:24:20
    Python爬虫介绍 聚焦爬虫和通用爬虫 爬虫根据其使用场景分为通用爬虫和聚焦爬虫,两者区别并不是很大,他们获取网页信息的方式是相同的。但通用爬虫收集网页的全部信息,而聚焦爬虫则只获取和指定内容相关的网页...

    Python爬虫介绍

    聚焦爬虫和通用爬虫

    爬虫根据其使用场景分为通用爬虫和聚焦爬虫,两者区别并不是很大,他们获取网页信息的方式是相同的。但通用爬虫收集网页的全部信息,而聚焦爬虫则只获取和指定内容相关的网页信息,即需要信息的筛选

    爬虫的工作原理

    通用爬虫是百度谷歌这样提供搜索服务的公司使用的,他们需要将网上所有的网页信息通过爬虫全部抓取并存储起来,并对这些信息进行分析处理,用户进行搜索时就把有相关信息的网页展示出来。通用爬虫需要很大的硬件方面的支持,才能将互联网上的信息全部爬取,而聚焦爬虫只获取和目标信息相关的内容,所以比较简便,使用也更广泛

    通用爬虫的工作过程如下:

    第一步:抓取网页

    首先选取一部分的种子URL,将这些URL放入待抓取URL队列

    取出待抓取URL,解析DNS得到主机的IP,并将URL对应的网页下载下来,存储进已下载网页库中,并且将这些URL放进已抓取URL队列

    分析已抓取URL队列中的URL,分析其中的其他URL,并且将URL放入待抓取URL队列,从而进入下一个循环….
    这里写图片描述

    第二步:数据存储

    搜索引擎通过爬虫爬取到的网页,将数据存入原始页面数据库。其中的页面数据与用户浏览器得到的HTML是完全一样的

    搜索引擎蜘蛛在抓取页面时,也做一定的重复内容检测,一旦遇到访问权重很低的网站上有大量抄袭、采集或者复制的内容,很可能就不再爬取

    第三步:预处理

    搜索引擎将爬虫抓取回来的页面,进行各种步骤的预处理。比如:提取文字,中文分词,索引处理,链接关系计算等,除了HTML文件外,搜索引擎通常还能抓取和索引以文字为基础的多种文件类型,如 PDF、Word、WPS、XLS、PPT、TXT 文件等。我们在搜索结果中也经常会看到这些文件类型

    但搜索引擎还不能处理图片、视频、Flash 这类非文字内容,也不能执行脚本和程序

    第四步:提供检索服务

    搜索引擎在对信息进行组织和处理后,为用户提供关键字检索服务,将用户检索相关的信息展示给用户

    Python爬虫的基本库—–urllib2库

    所谓网页抓取,就是把URL地址中指定的网络资源从网络流中读取出来,保存到本地。 在Python中有很多库可以用来抓取网页,其中urllib2库比较经典和常用的一个爬虫库。urllib2在python3中更名为urllib.request

    urllib2库的简单使用

    我用的Python3,所以调用urllib2库时用urllib.request

    一下是最简单的一个Python爬虫程序,爬取百度首页的信息

    该例子中只是用了一个方法urlopen()方法,该方法是urllib2爬取网页时最核心的方法

    # 导入urllib.request 库
    import urllib.request
    
    # 向指定的url发送请求,并返回服务器响应的类文件对象
    response = urllib.request.urlopen("http://www.baidu.com")
    
    # 类文件对象支持 文件对象的操作方法,如read()方法读取文件全部内容,返回字符串
    html = response.read()
    
    # 打印网页内容
    print (html)

    在控制台输入命令Python spider1.py,爬虫抓取了百度首页的网页内容,并打印了下来
    这里写图片描述
    下图是使用浏览器打开百度首页网页源码,可以发现和爬虫爬取的内容完全相同
    这里写图片描述

    添加请求信息

    request对象的使用

    上面的例子中,只用了一个urlopen()方法,但是在实际生产过程中,这是远远不够的,在根据URL访问网站时,需要添加一些请求信息,这样才不会被反爬虫机制阻碍爬虫的正常工作

    添加请求信息通过Request对象完成,如下,将URL信息封装到request对象中,并把request对象作为urlopen()方法的参数

    import urllib.request
    
    # url 作为Request()方法的参数,构造并返回一个Request对象
    request = urllib.request.Request("http://www.baidu.com")
    
    # 使用request对象作为urlopen方法的参数
    response = urllib.request.urlopen(request)
    
    html = response.read()
    
    print (html)

    通过request对象添加User-Agent

    上面的程序中,只向request对象中添加了目标网站的URL地址,下面的程序向request中多添加了一个User-Agent

    import urllib.request
    
    # 网站的URL地址
    url = "http://www.itcast.cn"
    
    # "User-Agent"信息
    header = {"User-Agent" : "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0;"} 
    
    # 将URL和User-Agent添加到request对象中
    request = urllib.request.Request(url, headers = header)
    
    response = urllib.request.urlopen(request)
    
    html = response.read()
    
    print (html)

    通过request对象添加请求头

    再向request中添加一个请求头

    import urllib.request
    
    url = "http://www.itcast.cn"
    
    header = {"User-Agent" : "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0;"} 
    
    request = urllib.request.Request(url, headers = header)
    
    # 使用add_header()方法向request中添加请求头信息
    request.add_header("Connection", "keep-alive")
    
    response = urllib.request.urlopen(request)
    
    html = response.read()
    
    print (html)
    展开全文
  • 原计划继续写一下关于手机APP的爬虫,结果发现夜神模拟器总是卡死,比较懒,不想找原因了,哈哈,所以接着写后面的博客了,从50篇开始要写几篇python爬虫的骚操作,也就是用Python3通过爬虫实现一些小工具。...

    爬虫背景

    原计划继续写一下关于手机APP的爬虫,结果发现夜神模拟器总是卡死,比较懒,不想找原因了,哈哈,所以接着写后面的博客了,从50篇开始要写几篇python爬虫的骚操作,也就是用Python3通过爬虫实现一些小工具。

    Python3 VIP视频下载器

    这种软件或者网站满天都是了,就是在线观看收费网站的VIP视频,你只要会玩搜索引擎或者是一个程序员基本都知道,虽说一直在被封杀,但是能赚钱的地方就一定有人钻漏洞。今天要实现的就是通过别人的API在Python中下载ts视频到本地,自己去百度一下TS视频是什么吧。
    python3图片爬虫

    找相关的接口

    我随便搜索了一下,那是非常多的,版权问题,就不放相关的地址了,当然在代码中还是会出现一下的。

    我找到这个接口应该是目前相对比较稳定的,并且还在更新的

    我看了一下,他中间主要通过三个API整体实现的页面逻辑

    首先你先去优酷啊,腾讯啊,爱奇艺啊找个VIP视频的地址,这个随意啦

    我找了一个《叶问外传》

    http://v.youku.com/v_show/id_XNDA0MDg2NzU0OA==.html?spm=a2h03.8164468.2069780.5  
    

    python3图片爬虫

    编写代码几个步骤

    在浏览器测试播放地址,得到线路播放数据

    http://y.mt2t.com/lines?url=https://v.qq.com/x/cover/5a3aweewodeclku/b0024j13g3b.html  
    

    在这里插入图片描述
    在页面的源码中,请注意,打开开发者工具直接按快捷键F12即可,右键已经被锁定。
    在源码中,发现真实的调用地址

    python3图片爬虫

    所以,你需要先匹配出来key来,非常简单,使用正则表达式即可

    import requests
    import re
    class VIP(object):
        def __init__(self):
            self.api = "http://y.mt2t.com/lines?url="
            self.url = "http://v.youku.com/v_show/id_XNDA0MDg2NzU0OA==.html?spm=a2h03.8164468.2069780.5"
    
        def run(self):
            res = requests.get(self.api+self.url)
            html = res.text
    
            key = re.search(r'key:"(.*?)"',html).group(1)
            print(key)
    
    if __name__ == '__main__':
        vip = VIP()
        vip.run()
    

    得到key之后,就可以进行获取播放地址了,经过分析也可以知道接口为

    Request URL: http://y.mt2t.com/lines/getdata
    Request Method: POST
    

    那么只需要编写一下即可

    import requests
    import re
    import json
    
    class VIP(object):
        def __init__(self):
            self.api = "http://y.mt2t.com/lines?url="
            self.post_url = "http://y.mt2t.com/lines/getdata"
            self.url = "http://v.youku.com/v_show/id_XNDA0MDg2NzU0OA==.html?spm=a2h03.8164468.2069780.5"
    
        def run(self):
            res = requests.get(self.api+self.url)
            html = res.text
    
            key = re.search(r'key:"(.*?)"',html).group(1)
            return key
    
        def get_playlist(self):
    
            key = self.run()
    
            data = {
                "url":self.url,
                "key":key
            }
            html = requests.post(self.post_url,data=data).text
            dic = json.loads(html)
            print(dic)
    
    if __name__ == '__main__':
        vip = VIP()
        vip.get_playlist()
    

    上面的代码可以得到如下的数据集

    python3图片爬虫
    这个数据集需要解析一下,用来获取播放地址,请注意还有一个接口我们需要打通

    Request URL: http://y2.mt2t.com:91/ifr/api
    Request Method: POST
    

    参数如下

    url: +bvqT10xBsjrQlCXafOom96K2rGhgnQ1CJuc5clt8KDHnjH75Q6BhQ4Vnv7gUk+SpJYws4A93QjxcuTflk7RojJt0PiXpBkTAdXtRa6+LAY=
    type: m3u8
    from: mt2t.com
    device: 
    up: 0
    

    这个API的所有参数都是从刚才获得的数据集分解出来的
    提取上面结果集中的URL

    http://y2.mt2t.com:91/ifr?url=%2bbvqT10xBsjrQlCXafOom96K2rGhgnQ1CJuc5clt8KDHnjH75Q6BhQ4Vnv7gUk%2bSpJYws4A93QjxcuTflk7RojJt0PiXpBkTAdXtRa6%2bLAY%3d&type=m3u8
    

    对这个URL进行分解,这个地方你需要了解一般情况下URL进行哪些符号的特殊编码

    大小写都有可能

    符号 特殊编码
    + %2d
    / %2f
    % %25
    = %3d
    ? %3F
    # %23
    & %26

    所以编写的代码如下

        def url_spilt(self):
            url = "http://y2.mt2t.com:91/ifr?url=%2bbvqT10xBsjrQlCXafOom96K2rGhgnQ1CJuc5clt8KDHnjH75Q6BhQ4Vnv7gUk%2bSpJYws4A93QjxcuTflk7RojJt0PiXpBkTAdXtRa6%2bLAY%3d&type=m3u8"
            url = url.split("?url=")[1].split("&")[0].replace("%2b","+").replace("%3d","=").replace("%2f","/")
            print(url)
    

    接下来获取type 这个比较容易
    只需要判断以下type=是否在字符串中然后截取即可。

    url截取的代码如下

        def url_spilt(self,url):
            #url = "http://y2.mt2t.com:91/ifr?url=%2bbvqT10xBsjrQlCXafOom96K2rGhgnQ1CJuc5clt8KDHnjH75Q6BhQ4Vnv7gUk%2bSpJYws4A93QjxcuTflk7RojJt0PiXpBkTAdXtRa6%2bLAY%3d&type=m3u8"
            url_param = url.split("?url=")[1].split("&")[0].replace("%2b","+").replace("%3d","=").replace("%2f","/")
            if "type=" in url:
                type = url.split("type=")[1]
            else:
                type = ""
            return url_param,type
    

    完善get_playlist函数,最终的代码如下

        def get_playlist(self):
    
            key = self.run()
    
            data = {
                "url":self.url,
                "key":key
            }
            html = requests.post(self.post_url,data=data).text
            dic = json.loads(html)
    
            for item in dic:
                url_param, type = self.url_spilt(item["Url"])
                res = requests.post(self.get_videourl,data={
                    "url":url_param,
                    "type":type,
                    "from": "mt2t.com",
                    "device":"",
                    "up":"0"
                })
                play = json.loads(res.text)
                print(play)
    

    运行之后得到下面的提示,其中最重要的m3u8已经成果获取到,完成任务
    python3图片爬虫
    python3图片爬虫

    展开全文
  • Python 爬虫入门

    千次阅读 多人点赞 2019-03-13 17:15:52
    Python 爬虫入门一、准备工作1、Python安装及使用pip安装第三方库二、提取网页数据1、使用 Python 下载网页代码2、提取网页中所需内容三、一个简单的网络爬虫1、网页结构的相似性2、爬虫的基本逻辑四、存储格式化...

    一、准备工作

    • 安装 Python 3.6 及以上版本
    • 会使用pip安装第三方库

    1、Python安装及使用pip安装第三方库

    1. 官网https://www.python.org/下载并安装,勾选pip安装选项
    2. 打开控制台,输入 python --version 查看 Python 版本,对于学习者来说,保持使用最新版本的 Python 是个好习惯。
    3. 使用 pip 安装 requests_html 库,pip install requests_html,根据网络情况,通常需要几分钟时间。

    二、提取网页数据

    1、使用 Python 下载网页代码

    新建一个 crawler.py 文件,输入并执行以下 4 行代码:

    from requests_html import HTMLSession
    session = HTMLSession()
    r = session.get('https://3w.huanqiu.com/a/c36dc8/7KZVzJcCY7K?agt=20&tt_group_id=6667596831221875203')
    print(r.text)
    

    可看到输出为:

    <!DOCTYPE html>
    <html lang="zh">
    <head>
        <meta charset="UTF-8">
        <title>惨败!英国脱欧协议草案以149票之差被下议院否决</title>
        <meta name="keywords" content="惨败,英国脱欧协议草案,以149票之差,被下议院,否决">
        <meta name="description" content="惨败!英国脱欧协议草案以149票之差被下议院否决">
        <link rel="shortcut icon" href="/favicon.ico"/>
        <link rel="stylesheet" href="//at.alicdn.com/t/font_564819_nzs674i0u17wg66r.css">
        <link rel="stylesheet" href="//himg2.huanqiu.com/statics/3w/v2/dist/css/index.css">
        <script src="//himg2.huanqiu.com/statics/3w/v2/dist/libs/jquery1.9.1.js" type="text/javascript"></script>
        </script>
    </head>
    #以下省略200行
    

    2、提取网页中所需内容

    查看一段内容的代码,在代码上点击右键,选择 Copy -> Copy Selector (或者 Copy CSS Selector、复制 CSS 选择器),就能将这段内容对应的CSS选择器复制到剪贴板

    from requests_html import HTMLSession
    session = HTMLSession()
    r = session.get('https://3w.huanqiu.com/a/c36dc8/7KZVzJcCY7K?agt=20&tt_group_id=6667596831221875203')
    title = r.html.find('#article > h1 > strong', first=True)
    # r.html.find() 接受一个 CSS 选择器(字符串形式)作为参数
    # 返回在网页中使用该选择器选中的内容。
    
    print(title.text)
    

    三、一个简单的网络爬虫

    1、网页结构的相似性

    爬虫的目的,是从网站中自动化批量提取数据。

    链接相似 的网页通常具有相似的外观。
    外观相似 的网页通常具有相似的网页结构。
    这两个相似性是爬虫能够从一系列网站中自动化提取数据的重要基础。

    2、爬虫的基本逻辑

    在这里插入图片描述
    根据CSS选择器获取标题及时间:

    from requests_html import HTMLSession
    session = HTMLSession()
    links = ['https://3w.huanqiu.com/a/c36dc8/7KZVzJcCY7K?agt=20&tt_group_id=6667596831221875203', 'https://3w.huanqiu.com/a/c36dc8/7L0gRL1wTny?agt=20&tt_group_id=6667672210636800524', 'https://3w.huanqiu.com/a/fe5d4b/7KZgIE8zTbi?agt=20&tt_group_id=6667448441594970631']
    
    for link in links:
        r = session.get(link)
        title = r.html.find('#article > h1 > strong', first=True)
        date = r.html.find('#article > div.a-info > span.time', first=True)
        print(title.text, date.text)
    
    

    输出:

    惨败!英国脱欧协议草案以149票之差被下议院否决 2019-03-13 03:46
    港媒:俏江南创始人张兰因藐视法庭被香港法院判监禁12019-03-13 08:48
    他低估了美国的心狠手辣,世界500强企业就此被肢解! 2019-03-12 18:19
    

    四、存储格式化数据

    前文中一直使用 print 方法打印爬虫获取的数据,接下来将把这些数据保存到特定格式文件中。

    1、CSV 格式

    Python 提供了标准库 csv 来读写 csv 数据。

    新建一个 Python 文件,输入以下代码,并运行。

    import csv
    
    file = open('artical.csv', 'w', newline='')
    csvwriter = csv.writer(file)
    
    # 写入标题行
    csvwriter.writerow(['标题', '时间'])
    # 写入数据
    csvwriter.writerow(['title1', '10:30'])
    csvwriter.writerow(['title2', '11:10'])
    csvwriter.writerow(['title3', '12:50'])
    file.close()
    
    

    可用EXCEL或记事本打开artical.csv文件。

    2、将爬虫数据写入CSV文件

    上文代码可写做:

    from requests_html import HTMLSession
    import csv
    
    session = HTMLSession()
    
    file = open('artical.csv', 'w',newline='')
    csvwriter=csv.writer(file)
    csvwriter.writerow(['标题','时间'])
    
    links = ['https://3w.huanqiu.com/a/c36dc8/7KZVzJcCY7K?agt=20&tt_group_id=6667596831221875203', 'https://3w.huanqiu.com/a/c36dc8/7L0gRL1wTny?agt=20&tt_group_id=6667672210636800524', 'https://3w.huanqiu.com/a/fe5d4b/7KZgIE8zTbi?agt=20&tt_group_id=6667448441594970631']
    
    for link in links:
        r = session.get(link)
        title = r.html.find('#article > h1 > strong', first=True)
        date = r.html.find('#article > div.a-info > span.time', first=True)
        csvwriter.writerow([title.text, date.text])
    
    file.close()
    
    

    输出:
    在这里插入图片描述
    以上是爬虫的简单用法和基本逻辑,但离编写一个实际的爬虫还有一段距离。

    展开全文
  • python爬虫入门

    2015-11-02 21:15:02
    Python爬虫入门八之Beautiful Soup的用法 Python之lxml库学习笔记一 libxml2-python-2.7.7.win32-py2.7.exe
  • python 爬虫入门

    2018-04-29 10:18:30
    今天学习爬虫,成功了,开心的像个小孩环境 python3.5 pycharmimport urllib.request url = "http://www.zhihu.com" response = urllib.request.urlopen(url) html = response.read() data = ...
  • python 爬虫 入门

    2020-05-04 21:29:07
    以下将会展示一个入门爬虫程序,将会将爬取的数据临时存储在csv文件中。涉及到以下几个点: csv的写入和读取 分析爬取目的 解析文件结构 【Class 20】【实例】python 爬虫简单案例实现二—将数据保存为CSV文件 .....
  • 双色球预测,一个神奇的领域,多少人都想实现自动化处理,毕竟谁能掌握规律,谁就掌握了快速到达彼岸的资格。
  • Python爬虫入门教程 99-100 Python爬虫在线服务大全

    千次阅读 多人点赞 2020-10-27 20:38:13
    python爬虫不能一味的蛮干,有时候借助第三方提供的工具或者服务,快速达成爬取目标,不失为一种奇妙的解决技巧。
  • python爬虫入门教程(二):开始一个简单的爬虫

    万次阅读 多人点赞 2017-09-12 15:02:21
    python爬虫入门教程,介绍编写一个简单爬虫的过程。
  • 对于Python爬虫爱好者来说,寻找美丽的姑娘是最喜欢做的事情之一了

空空如也

1 2 3 4 5 ... 20
收藏数 12,198
精华内容 4,879
关键字:

python爬虫入门

python 订阅
爬虫 订阅