精华内容
下载资源
问答
  • Python爬虫入门项目

    万次阅读 多人点赞 2017-12-25 16:26:21
    代码 本项目使用python3的版本 获取源码:扫描下方关注微信公众号「裸睡的猪」回复:爬虫入门 获取 了解这个项目你只需要有简单的python基础,能了解python语法就可以。其实我自己也是python没学完,然后就开始写,...

    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爬虫入门教程(二):开始一个简单的爬虫

    万次阅读 多人点赞 2017-09-12 15:02:21
    python爬虫入门教程,介绍编写一个简单爬虫的过程。

    2019/10/28更新

    • 使用Python3,而不再是Python2

    转载请注明出处:https://blog.csdn.net/aaronjny/article/details/77945329

    爬虫入门系列教程:


    上一篇讲了开始爬虫前的准备工作。当我们完成开发环境的安装、IDE的配置之后,就可以开始开发爬虫了。 这一篇,我们开始写一个超级简单的爬虫。

    1.爬虫的过程分析

    当人类去访问一个网页时,是如何进行的?
      ①打开浏览器,输入要访问的网址,发起请求。
      ②等待服务器返回数据,通过浏览器加载网页。
      ③从网页中找到自己需要的数据(文本、图片、文件等等)。
      ④保存自己需要的数据。

    对于爬虫,也是类似的。它模仿人类请求网页的过程,但是又稍有不同。
      首先,对应于上面的①和②步骤,我们要利用python实现请求一个网页的功能。
      其次,对应于上面的③步骤,我们要利用python实现解析请求到的网页的功能。
      最后,对于上面的④步骤,我们要利用python实现保存数据的功能。
      因为是讲一个简单的爬虫嘛,所以一些其他的复杂操作这里就不说了。下面,针对上面几个功能,逐一进行分析。

    2.如何用python请求一个网页

    作为一门拥有丰富类库的编程语言,利用python请求网页完全不在话下。这里推荐一个非常好用的第三方类库requests。

    2.1 requests

    2.1.1 安装方式

    打开终端或者cmd,在里面输入以下指令并回车

    pip3 install requests
    

    安装requests
      一般不会出什么问题,如果下载太慢,是因为pip使用的源服务器在国外,可以设置pip使用国内镜像源,设置方法可以参考PyPI使用国内源

    2.1.2 测试是否安装成功

    在命令行中输入python,敲击回车,进入python交互环境。在里面输入以下代码并回车:

    import requests
    

    如果不报错,就安装成功了,如下图:
      测试requests安装是否成功

    2.2 使用requests请求网页

    打开pycharm,创建一个项目,嗯,随便取个名字吧。
      创建项目
      创建成功后,再创建一个py文件,用来写代码。嗯,再随便取个名字= =教程(二)的2.2,那就spider_2_2_2吧。
      创建2.2.2
      在里面输入以下代码:

    #coding=utf-8
    import requests
    
    resp=requests.get('https://www.baidu.com') #请求百度首页
    print(resp) #打印请求结果的状态码
    print(resp.content) #打印请求到的网页源码
    

    对上面的代码进行以下简单的分析:
      我是用的是python2.7,第1行到第4行,都是为了将字符编码设置为utf8
      第2行:引入requests包。
      第4行:使用requests类库,以get的方式请求网址https://www.baidu.com,并将服务器返回的结果封装成一个对象,用变量resp来接收它。
      第5行:一般可以根据状态码来判断是否请求成功,正常的状态码是200,异常状态码就很多了,比如404(找不到网页)、301(重定向)等。
      第6行:打印网页的源码。注意,只是源码。不像是浏览器,在获取到源码之后,还会进一步地取请求源码中引用的图片等信息,如果有JS,浏览器还会执行JS,对页面显示的内容进行修改。使用requests进行请求,我们能够直接获取到的,只有最初始的网页源码。也正是因为这样,不加载图片、不执行JS等等,爬虫请求的速度会非常快。
      代码很短吧?一行就完成了请求,可以,这很python
      现在,运行一下代码看看吧。
      运行结果
      箭头指向的是状态码,可以看到,200,请求正常。
      被圈起来是网页的源码。

    3.如何用python解析网页源码

    网页源码我们拿到了,接下来就是要解析了。python解析网页源码有很多种方法,比如BeautifulSoup、正则、pyquery、xpath等。这里我简单介绍一下。

    3.1 网页源码解析器

    3.1.1 BeautifulSoup

    这是我比较推荐的一款解析器,简单易用,容易理解。
      但是使用bs4还需要安装另一个类库lxml,用来代替bs4默认的解析器。之所以这样做,是因为默认的那个实在太慢了,换用了lxml后,可以大幅度提升解析速度。

    3.1.1.1 安装

    命令行中输入以下指令并回车,安装bs4:

    pip3 install beautifulsoup4
    

    安装bs4
      使用pip直接安装lxml会出错,所以要用些特别的方法。Windows用户的话,去百度搜一下lxml在Windows环境下的安装方法,网上有很多,我就不多说了(主要是嫌麻烦= =)。Ubuntu用户就很方便了,在终端里面输入以下指令并回车就行了:

    apt-get install python-lxml
    

    python-lxml

    3.1.1.2 测试是否安装成功

    进入python交互环境,引用bs4和lxml类库,不报错即安装成功。

    import bs4
    import lxml
    

    bs4+lxml

    3.1.2 正则

    这个不用安装,标准库里带的就有。
      正则的优点:①速度快 ②能够提取有些解析器提取不到的数据
      正则的缺点:①不够直观,很难从面向对象的角度来考虑数据的提取 ②你得会写正则表达式
      教程就不放了,善用百度嘛。正则一般用来满足特殊需求、以及提取其他解析器提取不到的数据,正常情况下我会用bs4,bs4无法满足就用正则。
      当然了,如果你喜欢,全部用正则解析也是没问题的,你喜欢就好= =。

    3.1.3 pyquery

    这个解析器的语法和jQuery很相似,所以写过jQuery的同学用起来可能比较容易上手。国内有个dalao写的爬虫框架pyspider用的就是这个解析器。
      如果没用过jQuery,那就在bs4和pyquery两个里面选一个学吧,一般情况下会一个就够了。

    3.1.3.1 安装

    pip3 install pyquery
    

    3.1.3.2 测试

    import pyquery
    

    3.2 使用BeautifulSoup+lxml解析网页源码

    接着上面的代码来,我们使用BeautifulSoup+lxml解析请求到的网页源码。
      从百度的首页,可以通过点击跳转到很多其他页面,比如说下面圈起来的,点击都会跳转到新的页面:
      百度首页
      现在,我们想要用python获得从百度能够跳转到的页面的链接,该怎么做?
      代码很简单,接着上面的写:

    #coding=utf-8
    import requests
    from bs4 import BeautifulSoup
    
    resp=requests.get('https://www.baidu.com') #请求百度首页
    print(resp) #打印请求结果的状态码
    print(resp.content) #打印请求到的网页源码
    
    bsobj=BeautifulSoup(resp.content,'lxml') #将网页源码构造成BeautifulSoup对象,方便操作
    a_list=bsobj.find_all('a') #获取网页中的所有a标签对象
    for a in a_list:
        print(a.get('href')) #打印a标签对象的href属性,即这个对象指向的链接地址
    

    首先,第3行,引入我们解析时要使用的类库,beautifulsoup4。
      第9行,将网页的源码转化成了BeautifulSoup的对象,这样我们可以向操作DOM模型类似地去操作它。
      第10行,从这个BeautifulSoup对象中,获取所有的a标签对象(大家应该知道a标签对象是什么吧,网页中的链接绝大多数都是a对象实现的),将他们组成一个列表,也就是a_list。
      第11、12行,遍历这个列表,对于列表中的每一个a标签对象,获取它的属性href的值(href属性记录一个a标签指向的链接地址)。获取一个标签对象的属性,可以使用get(‘xx’)方法,比如a_tag是一个a标签对象,获取它的href的值,就是a_tag.get('href'),获取它的class信息可以用a_tag.get('class'),这将返回一个修饰该标签的class列表。
      运行一下,可以看到,打印出了很多链接。
      运行结果
      这是个简单的例子,介绍如何开始一个简单爬虫,不涉及复杂操作(复杂的后面会上小项目,会介绍)。关于beautifulsoup的详细用法,请自行百度。

    3.3 简单的保存数据的方法

    保存数据的方法大概可以分为几类:保存文本、保存二进制文件(包括图片)、保存到数据库。保存二进制文件和保存到数据库后面会具体说,这里简单讲一下怎么保存到文本。
      python里面操作文本相当的简单。现在,我将刚才提取出来的链接保存到一个名称为url.txt的文本里面去,将上面的代码稍作修改。

    #coding=utf-8
    import requests
    from bs4 import BeautifulSoup
    
    resp=requests.get('https://www.baidu.com') #请求百度首页
    print(resp) #打印请求结果的状态码
    print(resp.content) #打印请求到的网页源码
    
    bsobj=BeautifulSoup(resp.content,'lxml') #将网页源码构造成BeautifulSoup对象,方便操作
    a_list=bsobj.find_all('a') #获取网页中的所有a标签对象
    text='' # 创建一个空字符串
    for a in a_list:
        href=a.get('href') #获取a标签对象的href属性,即这个对象指向的链接地址
        text+=href+'\n' #加入到字符串中,并换行
    with open('url.txt','w') as f: #在当前路径下,以写的方式打开一个名为'url.txt',如果不存在则创建
        f.write(text) #将text里的数据写入到文本中
    

    代码中注释写得很清楚了,就不多做解释了。值得一提的是,使用with…as…来打开文件,在操作完成后,会自动关闭文件,不用担心忘记关闭文件了,超级好用啊!
      运行一下代码,可以发现,当前路径下多了个名为url.txt的文件。
      新文件
      打开后,能够看到我们刚才提取出来的url。
      url.txt

    4.更多

    虽然东西不多,但是写了挺长时间的。因为平时在一边上课,一边实习,时间真的不多,抽着时间一点点写的。后面我尽量加快速度写吧,当然了,尽量嘛,写得慢了的话……你顺着网线过来打我呀~
      我也只是个菜鸟,文中错误的地方,欢迎拍砖~

    展开全文
  • Python爬虫入门

    2017-09-30 20:18:18
    Python爬虫入门,Python爬虫框架,正则表达式,以及scrapy入门
  • 网络爬虫入门到精通

    2019-04-08 17:58:39
    网络爬虫入门到精通
  • python爬虫入门

    2019-01-27 18:36:10
    详细的pathon爬虫入门,带有初步的爬虫代码,从最开始的函数引入到最后的代码实现都有详细解释
  • python 爬虫入门学习资料/python 爬虫入门学习资料/python 爬虫入门学习资料/python 爬虫入门学习资料 网盘资源
  • java 简单爬虫入门maven项目
  • pachong_爬虫入门_源码

    2021-09-30 00:15:52
    爬虫入门,如何爬取网页,解析内容,数据存储。
  • Python爬虫入门以及实现,四周实现爬虫从入门到精通,内含网络课程,帮你你更加直观的了解爬虫,一步一步带你学会爬虫的编码!
  • java小爬虫入门案例

    2018-09-28 19:30:27
    java小的爬虫入门,使用jsoup入门案例,可以参考看看,免费看
  • 爬虫入门文章

    2018-11-30 10:49:39
  • python爬虫入门教程

    2016-12-30 13:50:58
    Python 爬虫入门三之 Urllib 库的基本使用 Python 那么接下来,小伙伴们就一起和我真正迈向我们的爬虫之路吧。
  • Python爬虫入门之初遇lxml库

    万次阅读 多人点赞 2020-12-19 00:42:15
    Python爬虫入门之初遇lxml库 爬虫是什么 所谓爬虫,就是按照一定的规则,自动的从网络中抓取信息的程序或者脚本。万维网就像一个巨大的蜘蛛网,我们的爬虫就是上面的一个蜘蛛,不断的去抓取我们需要的信息。 爬虫...

    Python爬虫入门之初遇lxml库

    1.爬虫是什么

    所谓爬虫,就是按照一定的规则,自动的从网络中抓取信息的程序或者脚本。万维网就像一个巨大的蜘蛛网,我们的爬虫就是上面的一个蜘蛛,不断的去抓取我们需要的信息。

    2.爬虫三要素

    • 抓取
    • 分析
    • 存储

    3.爬虫的过程分析

    当人类去访问一个网页时,是如何进行的?
      ①打开浏览器,输入要访问的网址,发起请求。
      ②等待服务器返回数据,通过浏览器加载网页。
      ③从网页中找到自己需要的数据(文本、图片、文件等等)。
      ④保存自己需要的数据。

    对于爬虫,也是类似的。它模仿人类请求网页的过程,但是又稍有不同。
      首先,对应于上面的①和②步骤,我们要利用python实现请求一个网页的功能。
      其次,对应于上面的③步骤,我们要利用python实现解析请求到的网页的功能。
      最后,对于上面的④步骤,我们要利用python实现保存数据的功能。
      因为是讲一个简单的爬虫嘛,所以一些其他的复杂操作这里就不说了。下面,针对上面几个功能,逐一进行分析。

    4.如何用python请求一个网页

    作为一门拥有丰富类库的编程语言,利用python请求网页完全不在话下。这里推荐一个非常好用的类库urllib.request。

    如何模拟用户请求请看我的另一篇博客:https://laoniu.blog.csdn.net/article/details/111472608

    4.1.抓取网页

    • urllib.request库使用
    import urllib.request
    
    response = urllib.request.urlopen('https://laoniu.blog.csdn.net/')
    print(response.read().decode('utf-8'))

    这样就可以抓取csdn我的主页的html文档

    我们使用爬虫就是需要在网页中提取我们需要的数据,接下来我们来学习抓取一下百度搜索页的热榜数据

    4.2.如何解析网页呢

    使用lxml库

    lxml 是一种使用 Python 编写的库,可以迅速、灵活地处理 XML 和 HTML。

    它支持 XML Path Language (XPath) 和 Extensible Stylesheet Language Transformation (XSLT),并且实现了常见的 ElementTree API。

    安装

    • windows下安装
    #pip方式安装
    pip3 install lxml
    
    #wheel方式安装 
    #下载对应系统版本的wheel文件:http://www.lfd.uci.edu/~gohlke/pythonlibs/#lxml
    pip3 install lxml-4.2.1-cp36-cp36m-win_amd64.whl
    • linux下安装
    yum install -y epel-release libxslt-devel libxml2-devel openssl-devel
    
    pip3 install lxml

    环境/版本一览:

    • 开发工具:PyCharm 2020.2.3
    • python:3.8.5

    4.3.编写代码

    import urllib.request
    from lxml import etree
    
    # 获取百度热榜
    url = "https://www.baidu.com/s?ie=UTF-8&wd=1"
    # 我们在请求头加入User-Agent参数,这样可以让服务端认为此次请求是用户通过浏览器发起的正常请求,防止被识别为爬虫程序请求导致直接拒绝访问
    req = urllib.request.Request(url=url, headers={
        'User-Agent': 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 11_1_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'
    })
    # 发起请求
    html_resp = urllib.request.urlopen(req).read().decode("utf-8")

    到这里我们可以顺利获取百度的搜索页面html文档

    我门需要看一下热搜排行榜的标签元素在哪里

    找到第一条  右键复制 XPath   (后边说XPath是什么)

    我们需要了解并使用XPath,XPath即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的语言。

    复制的内容结果是://*[@id="con-ar"]/div[2]/div/div/table/tbody[1]/tr[1]

    这xPath字符串 表示现在在html定位的位置就是热点新闻第一行内容

    5.XPath常用规则

    表达式描述
    nodename选取此节点的所有子节点
    /从当前节点选取直接子节点
    //从当前节点选取子孙节点
    .选取当前节点
    ..选取当前节点的父节点
    @选取属性
    *通配符,选择所有元素节点与元素名
    @*选取所有属性
    [@attrib]选取具有给定属性的所有元素
    [@attrib='value']选取给定属性具有给定值的所有元素
    [tag]选取所有具有指定元素的直接子节点
    [tag='text']选取所有具有指定元素并且文本内容是text节点

    6.继续分析

    那么我们要获取所有的热点新闻该怎么写呢

    继续看网页

    可以看到所有的热榜分别在三个<tbody>之下

    修改一下刚才复制的XPath

    //*[@id="con-ar"]/div[2]/div/div/table/tbody[1]/tr[1] 改为  //*[@id="con-ar"]/div[2]/div/div/table/tbody/tr

    这样XPath就会定位到这三个tbody下的所有tr元素内容

    我们继续看一下tr是不是我们想要的内容,展开一个tr看看

    淦~还有一堆,百度你不讲武德,,

    “马保国”经典语录 年轻人不讲武得 耗子为之

    这该怎么办。我们需要拿到数据是 【标题】 【访问链接】 【热度】,现在手里已经拿到的是所有的tr元素

    紧接着从tr下手 直接 拿到下面所有<a>标签的标题与超链接

    标题的XPath: */a/@title 超链接的XPath: */a/@href

    *表示匹配tr下的所有元素  /a是在*找到第一个a标签  @是属性选择器 titlehref就是要选择的素属性了

    还剩下个热度,let‘s me 继续操作,直接选择tr下的第二个td  XPath: td[2]

    分析完毕,把完整的代码贴出来

    import urllib.request
    from lxml import etree
    
    # 获取百度热榜
    
    url = "https://www.baidu.com/s?ie=UTF-8&wd=1"
    # 我们在请求头加入User-Agent参数,这样可以让服务端认为此次请求是用户通过浏览器发起的正常请求,防止被识别为爬虫程序请求导致直接拒绝访问
    req = urllib.request.Request(url=url, headers={
            'User-Agent': 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 11_1_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'
        })
    html_resp = urllib.request.urlopen(req).read().decode("utf-8")
    html = etree.HTML(html_resp)#初始化生成一个XPath解析对象
    _list = html.xpath("//*[@id='con-ar']/div[2]/div/div/table/tbody/tr")
    print(f"article count : {len(_list)}")
    
    for tr in _list:
        title = tr.xpath("*/a/@title")[0]  # 获取url的title
        href = tr.xpath("*/a/@href")[0] # 获取url的href
        hot = tr.xpath("string(td[2])").strip() # 获取热度
        print(f"{hot}\t{title}\thttps://www.baidu.com{href}")
    

    点击运行,程序啪就跑起来了,很快啊,数据全都过来了,我全都接住了,我笑了一下。希望百度耗子为之

    到此就完成了lxml xpath的基本使用,更详细的xpath教程请看 :https://www.w3school.com.cn/xpath/index.asp

    7.存储数据

    紧接着存储数据,修改一下代码

    print(f"article count : {len(_list)}")
    
    with open('g_data.text', 'w') as f:  # 在当前路径下,以写的方式打开一个名为'g_data.text',如果不存在则创建
        for tr in _list:
            title = tr.xpath("*/a/@title")[0]  # 获取url的title
            href = tr.xpath("*/a/@href")[0]  # 获取url的href
            hot = tr.xpath("string(td[2])").strip()  # 获取热度
            line = f"{hot}\t{title}\thttps://www.baidu.com{href}\n"
            f.write(line)  # 写入文件

    8.补充

    东西虽然不多,但是也是写了挺长时间,算是对自己学习的一个总结,也希望能够帮助大家,我也只是个菜鸟,文中错误的地方可以直接指出来

    展开全文
  • 爬虫入门到大牛笔记

    2020-12-02 21:02:37
    爬虫入门到大牛笔记 ,有详细的request,xpath,正则爬取方法,反爬技术,多线程,验证码破译,mongodb
  • 爬虫入门级别教程(小白水平)

    千次阅读 多人点赞 2021-04-13 09:14:15
    爬虫入门级别教程前言一、爬虫的合法性及其探究(1)、爬虫合法吗?(2)、爬虫要注意什么?二、爬虫的几个步骤1.指定url2.发送请求3.接受请求得到的数据4.进行持久化存储2.读入数据总结 前言 提示:随着数据相关...
  • 本文介绍 Python数据分析师 网络爬虫入门基础的内容。 网络通信基础知识 1.网络通信 OSI参考模型 TCP/IP的分层模型 OSI协议参考模型,是基于国际标准化组织(ISO)的建议发展起来的。 它分为7个层次:应用层、表示...
  • 资料仅可参考如有不妥请联系本人改正或者删除 * 2020年08月13日 python爬虫入门邓旭东 资料仅可参考如有不妥请联系本人改正或者删除 * 2020年08月13日 python爬虫入门邓旭东 资料仅可参考如有不妥请联系本人改正或者...
  • 在本篇文章中小编给大家整理的是关于Python爬虫入门基础知识点整理,有兴趣的朋友们可以跟着学习下。
  • 基于webmagic的网络爬虫入门demo 希望对大家有所帮助
  • java爬虫入门示例,包含所有源码。 主要实现了爬取大众点评商户基本信息 新手入门或者参考可用
  • python3.7 scrapy简单爬虫入门基于 http://www.okhqb.com/ 网站的简单示例。。
  • Python爬虫入门专栏文章目录.pdf
  • 爬虫入门之模拟用户请求

    万次阅读 2020-12-21 13:31:21
    接着上一篇文章Python爬虫入门之初遇lxml库,我们对爬虫程序发起的请求进行分析,爬虫爬取数据要做的就是模拟用户发起请求,接收到数据进行存储 我们先看一下一下正常的用户请求,然后再分析如何去模拟 1.正常的...
  • Python基础与爬虫入门ppt+代码
  • 一、专栏简介 老猿在2019年就开放了免费的爬虫专栏,相关实战...该专栏介绍爬虫入门的基础知识,以及爬取CSDN文章信息、博主信息、给文章点赞、评论等实战内容。 二、文章目录 Python爬虫入门1:序章 Python爬虫入门
  • 爬虫入门教程 —— 1

    万次阅读 多人点赞 2018-04-12 23:59:51
    爬虫入门教程 -1 很想做一些爬虫的基础性的教程,来与大家共同分享我的一些小经验, 我将以我认为的方式为大家讲解网络爬虫,如果你没有编程基础,对网络爬虫有兴趣,开始可能稍微有一些小难度,不过我希望能给你...
  • writer.writerow(item) def start(): """开始爬虫""" for i in range(1, 4): url = base_url.format(i) html = parse_url(url) parse_html(html) save() if __name__ == '__main__': start() 三、运行结果 美好的...
  • python网络爬虫入门进阶教程

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 62,120
精华内容 24,848
关键字:

爬虫入门

爬虫 订阅