精华内容
下载资源
问答
  • 利用Python爬虫网站数据直接导入mysql数据库中

    万次阅读 热门讨论 2019-07-05 18:41:18
    说明:可能经常出现要爬取某个网站的数据,这时候需要利用爬虫技术来完成,这块主要使用Python来实现。 如何搭建Python环境我上节文章有详细描述:https://blog.csdn.net/Joe192/article/details/94722117 (1)...

    说明:可能经常出现要爬取某个网站的数据,这时候需要利用爬虫技术来完成,这块主要使用Python来实现。

    如何搭建Python环境我上节文章有详细描述:https://blog.csdn.net/Joe192/article/details/94722117

    (1)导入包

    import requests
    from bs4 import BeautifulSoup
    import re
    import pymysql


    beautifulsoup是python的一个HTML解析库,可以用它来方便地从网页中提取数据。

    (2)发送请求并打印状态码

    url = 'https://docs.microsoft.com/zh-cn/sql/mdx/mdx-function-reference-mdx?view=sql-server-2017'
    res = requests.get(url)
    res.encoding='utf-8'
    print(res.status_code)

    encoding='utf-8' 里面处理中文乱码

    (3)分析网页发现所要的数据在<tbody>标签中

    通过beautifulsoup查找到所有的函数以及描述数据

    (4)通过正则表达式取出需要的数据

    #re匹配需要的数据
    pertern = re.compile(r'<a.*?><span data-stu-id="d5ccf-.*?">(.*?)</span>.*?</a>.*?<td><span data-ttu-id="d5ccf-.*?">(.*?)</span>.*?</td>',
        re.S)

    生成正则模式

    data = str(data)
    item = re.findall(pertern, data)

    对data进行强制类型转换(转为字符串)

    匹配出数据

    (5)存入数据库

    def create():
        db = pymysql.connect("localhost", "root", "root", "test")#连接数据库 
     
        cursor = db.cursor()
        cursor.execute("DROP TABLE IF EXISTS FUN_TEST")
     
        sql = """CREATE TABLE FUN_TEST (
                ID INT PRIMARY KEY AUTO_INCREMENT,
                NAME CHAR(20),
                DESCRIBE1 CHAR(255))"""
     
        cursor.execute(sql)
     
        db.close()
     
    def insert(value):
        db = pymysql.connect("localhost", "root", "root", "test")
     
        cursor = db.cursor()
        sql = "INSERT INTO FUN_TEST(NAME,DESCRIBE1) VALUES (%s, %s)"
        try:
            cursor.execute(sql,value)
            db.commit()
            print('插入数据成功')
        except:
            db.rollback()
            print("插入数据失败")
        db.close()
     
    create()  #创建表

    首先创建表,如果存在相同名字的表,则删除;再创建表。

    插入数据。

    (6)源码

    #!/usr/bin/python3
    import requests
    from bs4 import BeautifulSoup
    import re
    import pymysql
     
    def create():
        db = pymysql.connect(host='localhost',user='root',password='root',database='test')#连接数据库 
     
        cursor = db.cursor()
        cursor.execute("DROP TABLE IF EXISTS FUN_TEST")
     
        sql = """CREATE TABLE FUN_TEST (
                ID INT PRIMARY KEY AUTO_INCREMENT,
                NAME CHAR(20),
                DESCRIBE1 CHAR(255))"""
     
        cursor.execute(sql)
     
        db.close()
     
    def insert(value):
        db = pymysql.connect(host='localhost',user='root',password='root',database='test')
     
        cursor = db.cursor()
        sql = "INSERT INTO FUN_TEST(NAME,DESCRIBE1) VALUES (%s, %s)"
        try:
            cursor.execute(sql,value)
            db.commit()
            print('插入数据成功')
        except:
            db.rollback()
            print("插入数据失败")
        db.close()
     
    create()  #创建表
     
    #re匹配需要的数据
    pertern = re.compile(r'<a data-linktype="relative-path" href=".*?">(.*?)</a>.*?<td>(.*?)</td>',
        re.S)
    url = 'https://docs.microsoft.com/zh-cn/sql/mdx/mdx-function-reference-mdx?view=sql-server-2017'
    res = requests.get(url)
    res.encoding='utf-8'
    print(res.status_code)
    soup = BeautifulSoup(res.text, 'html.parser')
    data = soup.find_all('tbody')
    print(data)
    data = str(data)
    item = re.findall(pertern, data)
    print(item)
    for i in item:
        print(i)
        insert(i)

    参考网站:

    https://blog.csdn.net/Air_RA/article/details/85225712#commentsedit

    https://www.cnblogs.com/sheng-247/p/7686014.html

    展开全文
  • Python爬虫100例教程导航帖(已完结)

    万次阅读 多人点赞 2019-01-08 23:40:01
    Python爬虫入门教程导航,目标100篇。 本系列博客争取把爬虫入门阶段的所有内容都包含住,需要你有较好的Python基础知识,当然你完全零基础也可以观看本系列博客。 Python爬虫入门教程,加油!

    Python爬虫入门教程导航,已经完结啦,以后的时间不定期补番。

     

    本系列博客争取把爬虫入门阶段的所有内容都包含住,需要你有较好的 Python 基础知识,当然你完全零基础也可以观看本系列博客。

    Python 爬虫入门教程,加油!

    基础篇,包含多线程爬虫

    1. Python爬虫入门教程 1-100 CentOS环境安装

    2. Python爬虫入门教程 2-100 和谐图网站爬取

    3. Python爬虫入门教程 3-100 美空网数据爬取

    4. Python爬虫入门教程 4-100 美空网未登录图片爬取

    5. Python爬虫入门教程 5-100 27270图片爬取

    6. Python爬虫入门教程 6-100 蜂鸟网图片爬取之一

    7. Python爬虫入门教程 7-100 蜂鸟网图片爬取之二

    8. 

    展开全文
  • 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爬虫的超详细讲解,用例子来给大家一步步分析爬虫的代码原理,由浅入深,老年人来了,我也给你整明白。
     
    

    先看后赞,养成习惯。
    点赞收藏,人生辉煌。

    在这里插入图片描述

    讲解我们的爬虫之前,先概述关于爬虫的简单概念(毕竟是零基础教程)

    爬虫

    网络爬虫(又被称为网页蜘蛛,网络机器人)就是模拟浏览器发送网络请求,接收请求响应,一种按照一定的规则,自动地抓取互联网信息的程序。
    原则上,只要是浏览器(客户端)能做的事情,爬虫都能够做。

    为什么我们要使用爬虫

    互联网大数据时代,给予我们的是生活的便利以及海量数据爆炸式的出现在网络中。
    过去,我们通过书籍、报纸、电视、广播或许信息,这些信息数量有限,且是经过一定的筛选,信息相对而言比较有效,但是缺点则是信息面太过于狭窄了。不对称的信息传导,以致于我们视野受限,无法了解到更多的信息和知识。
    互联网大数据时代,我们突然间,信息获取自由了,我们得到了海量的信息,但是大多数都是无效的垃圾信息。
    例如新浪微博,一天产生数亿条的状态更新,而在百度搜索引擎中,随意搜一条——减肥100,000,000条信息。
    在如此海量的信息碎片中,我们如何获取对自己有用的信息呢?
    答案是筛选!
    通过某项技术将相关的内容收集起来,在分析删选才能得到我们真正需要的信息。
    这个信息收集分析整合的工作,可应用的范畴非常的广泛,无论是生活服务、出行旅行、金融投资、各类制造业的产品市场需求等等……都能够借助这个技术获取更精准有效的信息加以利用。
    网络爬虫技术,虽说有个诡异的名字,让能第一反应是那种软软的蠕动的生物,但它却是一个可以在虚拟世界里,无往不前的利器。

    爬虫准备工作

    我们平时都说Python爬虫,其实这里可能有个误解,爬虫并不是Python独有的,可以做爬虫的语言有很多例如:PHP,JAVA,C#,C++,Python,选择Python做爬虫是因为Python相对来说比较简单,而且功能比较齐全。
    首先我们需要下载python,我下载的是官方最新的版本 3.8.3
    其次我们需要一个运行Python的环境,我用的是pychram
    在这里插入图片描述
    也可以从官方下载,
    我们还需要一些库来支持爬虫的运行(有些库Python可能自带了)
    在这里插入图片描述
    差不多就是这几个库了,良心的我已经在后面写好注释了
    在这里插入图片描述
    (爬虫运行过程中,不一定就只需要上面几个库,看你爬虫的一个具体写法了,反正需要库的话我们可以直接在setting里面安装)

    爬虫项目讲解

    我做的是爬取豆瓣评分电影Top250的爬虫代码
    我们要爬取的就是这个网站:https://movie.douban.com/top250

    这边我已经爬取完毕,给大家看下效果图,我是将爬取到的内容存到xls
    在这里插入图片描述

    我们的爬取的内容是:电影详情链接,图片链接,影片中文名,影片外国名,评分,评价数,概况,相关信息。

    代码分析

    先把代码发放上来,然后我根据代码逐步解析

    # -*- codeing = utf-8 -*-
    from bs4 import BeautifulSoup  # 网页解析,获取数据
    import re  # 正则表达式,进行文字匹配`
    import urllib.request, urllib.error  # 制定URL,获取网页数据
    import xlwt  # 进行excel操作
    #import sqlite3  # 进行SQLite数据库操作
    
    findLink = re.compile(r'<a href="(.*?)">')  # 创建正则表达式对象,标售规则   影片详情链接的规则
    findImgSrc = re.compile(r'<img.*src="(.*?)"', re.S)
    findTitle = re.compile(r'<span class="title">(.*)</span>')
    findRating = re.compile(r'<span class="rating_num" property="v:average">(.*)</span>')
    findJudge = re.compile(r'<span>(\d*)人评价</span>')
    findInq = re.compile(r'<span class="inq">(.*)</span>')
    findBd = re.compile(r'<p class="">(.*?)</p>', re.S)
    
    
    
    
    def main():
        baseurl = "https://movie.douban.com/top250?start="  #要爬取的网页链接
        # 1.爬取网页
        datalist = getData(baseurl)
        savepath = "豆瓣电影Top250.xls"    #当前目录新建XLS,存储进去
        # dbpath = "movie.db"              #当前目录新建数据库,存储进去
        # 3.保存数据
        saveData(datalist,savepath)      #2种存储方式可以只选择一种
        # saveData2DB(datalist,dbpath)
    
    
    
    # 爬取网页
    def getData(baseurl):
        datalist = []  #用来存储爬取的网页信息
        for i in range(0, 10):  # 调用获取页面信息的函数,10次
            url = baseurl + str(i * 25)
            html = askURL(url)  # 保存获取到的网页源码
            # 2.逐一解析数据
            soup = BeautifulSoup(html, "html.parser")
            for item in soup.find_all('div', class_="item"):  # 查找符合要求的字符串
                data = []  # 保存一部电影所有信息
                item = str(item)
                link = re.findall(findLink, item)[0]  # 通过正则表达式查找
                data.append(link)
                imgSrc = re.findall(findImgSrc, item)[0]
                data.append(imgSrc)
                titles = re.findall(findTitle, item)
                if (len(titles) == 2):
                    ctitle = titles[0]
                    data.append(ctitle)
                    otitle = titles[1].replace("/", "")  #消除转义字符
                    data.append(otitle)
                else:
                    data.append(titles[0])
                    data.append(' ')
                rating = re.findall(findRating, item)[0]
                data.append(rating)
                judgeNum = re.findall(findJudge, item)[0]
                data.append(judgeNum)
                inq = re.findall(findInq, item)
                if len(inq) != 0:
                    inq = inq[0].replace("。", "")
                    data.append(inq)
                else:
                    data.append(" ")
                bd = re.findall(findBd, item)[0]
                bd = re.sub('<br(\s+)?/>(\s+)?', "", bd)
                bd = re.sub('/', "", bd)
                data.append(bd.strip())
                datalist.append(data)
    
        return datalist
    
    
    # 得到指定一个URL的网页内容
    def askURL(url):
        head = {  # 模拟浏览器头部信息,向豆瓣服务器发送消息
            "User-Agent": "Mozilla / 5.0(Windows NT 10.0; Win64; x64) AppleWebKit / 537.36(KHTML, like Gecko) Chrome / 80.0.3987.122  Safari / 537.36"
        }
        # 用户代理,表示告诉豆瓣服务器,我们是什么类型的机器、浏览器(本质上是告诉浏览器,我们可以接收什么水平的文件内容)
    
        request = urllib.request.Request(url, headers=head)
        html = ""
        try:
            response = urllib.request.urlopen(request)
            html = response.read().decode("utf-8")
        except urllib.error.URLError as e:
            if hasattr(e, "code"):
                print(e.code)
            if hasattr(e, "reason"):
                print(e.reason)
        return html
    
    
    # 保存数据到表格
    def saveData(datalist,savepath):
        print("save.......")
        book = xlwt.Workbook(encoding="utf-8",style_compression=0) #创建workbook对象
        sheet = book.add_sheet('豆瓣电影Top250', cell_overwrite_ok=True) #创建工作表
        col = ("电影详情链接","图片链接","影片中文名","影片外国名","评分","评价数","概况","相关信息")
        for i in range(0,8):
            sheet.write(0,i,col[i])  #列名
        for i in range(0,250):
            # print("第%d条" %(i+1))       #输出语句,用来测试
            data = datalist[i]
            for j in range(0,8):
                sheet.write(i+1,j,data[j])  #数据
        book.save(savepath) #保存
    
    # def saveData2DB(datalist,dbpath):
    #     init_db(dbpath)
    #     conn = sqlite3.connect(dbpath)
    #     cur = conn.cursor()
    #     for data in datalist:
    #             for index in range(len(data)):
    #                 if index == 4 or index == 5:
    #                     continue
    #                 data[index] = '"'+data[index]+'"'
    #             sql = '''
    #                     insert into movie250(
    #                     info_link,pic_link,cname,ename,score,rated,instroduction,info)
    #                     values (%s)'''%",".join(data)
    #             # print(sql)     #输出查询语句,用来测试
    #             cur.execute(sql)
    #             conn.commit()
    #     cur.close
    #     conn.close()
    
    
    # def init_db(dbpath):
    #     sql = '''
    #         create table movie250(
    #         id integer  primary  key autoincrement,
    #         info_link text,
    #         pic_link text,
    #         cname varchar,
    #         ename varchar ,
    #         score numeric,
    #         rated numeric,
    #         instroduction text,
    #         info text
    #         )
    #
    #
    #     '''  #创建数据表
    #     conn = sqlite3.connect(dbpath)
    #     cursor = conn.cursor()
    #     cursor.execute(sql)
    #     conn.commit()
    #     conn.close()
    
    # 保存数据到数据库
    
    
    
    
    
    
    
    if __name__ == "__main__":  # 当程序执行时
        # 调用函数
         main()
        # init_db("movietest.db")
         print("爬取完毕!")
    
    

    下面我根据代码,从下到下给大家讲解分析一遍
    在这里插入图片描述

    -- codeing = utf-8 --,开头的这个是设置编码为utf-8 ,写在开头,防止乱码。
    然后下面 import就是导入一些库,做做准备工作,(sqlite3这库我并没有用到所以我注释起来了)。
    下面一些find开头的是正则表达式,是用来我们筛选信息的。
    (正则表达式用到 re 库,也可以不用正则表达式,不是必须的。)
    大体流程分三步走:

    1. 爬取网页
    2.逐一解析数据
    3. 保存网页

    先分析流程1,爬取网页,baseurl 就是我们要爬虫的网页网址,往下走,调用了 getData(baseurl) ,
    我们来看 getData方法

      for i in range(0, 10):  # 调用获取页面信息的函数,10次
            url = baseurl + str(i * 25)
    

    这段大家可能看不懂,其实是这样的:
    因为电影评分Top250,每个页面只显示25个,所以我们需要访问页面10次,25*10=250。

    baseurl = "https://movie.douban.com/top250?start="
    

    我们只要在baseurl后面加上数字就会跳到相应页面,比如i=1时

    https://movie.douban.com/top250?start=25

    我放上超链接,大家可以点击看看会跳到哪个页面,毕竟实践出真知。
    在这里插入图片描述

    然后又调用了askURL来请求网页,这个方法是请求网页的主体方法,
    怕大家翻页麻烦,我再把代码复制一遍,让大家有个直观感受

    def askURL(url):
        head = {  # 模拟浏览器头部信息,向豆瓣服务器发送消息
            "User-Agent": "Mozilla / 5.0(Windows NT 10.0; Win64; x64) AppleWebKit / 537.36(KHTML, like Gecko) Chrome / 80.0.3987.122  Safari / 537.36"
        }
        # 用户代理,表示告诉豆瓣服务器,我们是什么类型的机器、浏览器(本质上是告诉浏览器,我们可以接收什么水平的文件内容)
    
        request = urllib.request.Request(url, headers=head)
        html = ""
        try:
            response = urllib.request.urlopen(request)
            html = response.read().decode("utf-8")
        except urllib.error.URLError as e:
            if hasattr(e, "code"):
                print(e.code)
            if hasattr(e, "reason"):
                print(e.reason)
        return html
    

    这个askURL就是用来向网页发送请求用的,那么这里就有老铁问了,为什么这里要写个head呢?
    在这里插入图片描述

    这是因为我们要是不写的话,访问某些网站的时候会被认出来爬虫,显示错误,错误代码

    418

    这是一个梗大家可以百度下,

    418 I’m a teapot

    The HTTP 418 I’m a teapot client error response code indicates that
    the server refuses to brew coffee because it is a teapot. This error
    is a reference to Hyper Text Coffee Pot Control Protocol which was an
    April Fools’ joke in 1998.

    我是一个茶壶

    在这里插入图片描述

    所以我们需要 “装” ,装成我们就是一个浏览器,这样就不会被认出来,
    伪装一个身份。
    在这里插入图片描述

    来,我们继续往下走,

      html = response.read().decode("utf-8")
    

    这段就是我们读取网页的内容,设置编码为utf-8,目的就是为了防止乱码。
    访问成功后,来到了第二个流程:

    2.逐一解析数据

    解析数据这里我们用到了 BeautifulSoup(靓汤) 这个库,这个库是几乎是做爬虫必备的库,无论你是什么写法。

    下面就开始查找符合我们要求的数据,用BeautifulSoup的方法以及 re 库的
    正则表达式去匹配,

    findLink = re.compile(r'<a href="(.*?)">')  # 创建正则表达式对象,标售规则   影片详情链接的规则
    findImgSrc = re.compile(r'<img.*src="(.*?)"', re.S)
    findTitle = re.compile(r'<span class="title">(.*)</span>')
    findRating = re.compile(r'<span class="rating_num" property="v:average">(.*)</span>')
    findJudge = re.compile(r'<span>(\d*)人评价</span>')
    findInq = re.compile(r'<span class="inq">(.*)</span>')
    findBd = re.compile(r'<p class="">(.*?)</p>', re.S)
    

    匹配到符合我们要求的数据,然后存进 dataList , 所以 dataList 里就存放着我们需要的数据了。

    最后一个流程:

    3.保存数据

        # 3.保存数据
        saveData(datalist,savepath)      #2种存储方式可以只选择一种
        # saveData2DB(datalist,dbpath)
    

    保存数据可以选择保存到 xls 表, 需要(xlwt库支持)
    也可以选择保存数据到 sqlite数据库, 需要(sqlite3库支持)

    这里我选择保存到 xls 表 ,这也是为什么我注释了一大堆代码,注释的部分就是保存到 sqlite 数据库的代码,二者选一就行

    保存到 xls 的主体方法是 saveData (下面的saveData2DB方法是保存到sqlite数据库)

    def saveData(datalist,savepath):
        print("save.......")
        book = xlwt.Workbook(encoding="utf-8",style_compression=0) #创建workbook对象
        sheet = book.add_sheet('豆瓣电影Top250', cell_overwrite_ok=True) #创建工作表
        col = ("电影详情链接","图片链接","影片中文名","影片外国名","评分","评价数","概况","相关信息")
        for i in range(0,8):
            sheet.write(0,i,col[i])  #列名
        for i in range(0,250):
            # print("第%d条" %(i+1))       #输出语句,用来测试
            data = datalist[i]
            for j in range(0,8):
                sheet.write(i+1,j,data[j])  #数据
        book.save(savepath) #保存
    

    创建工作表,创列(会在当前目录下创建),

       sheet = book.add_sheet('豆瓣电影Top250', cell_overwrite_ok=True) #创建工作表
        col = ("电影详情链接","图片链接","影片中文名","影片外国名","评分","评价数","概况","相关信息")
    

    然后把 dataList里的数据一条条存进去就行。

    最后运作成功后,会在左侧生成这么一个文件
    在这里插入图片描述

    打开之后看看是不是我们想要的结果
    在这里插入图片描述

    成了,成了!

    在这里插入图片描述

    如果我们需要以数据库方式存储,可以先生成 xls 文件,再把 xls 文件导入数据库中,就可以啦

    本篇文章讲解到这里啦,我感觉我讲的还算细致吧,爬虫我也是最近才可以学,对这个比较有兴趣,我肯定有讲的不好的地方,欢迎各位大佬来指正我 。

    我也在不断的学习中,学到新东西第一时间会跟大家分享
    大家可以动动小手,点波关注不迷路。

    如果关于本篇文章有不懂的地方,欢迎大家下面留言,我知道的都会给大家一 一解答。

    最后给大家放波福利,博主最近在搞阿里云推广,

    活动折扣价:全网最低价87元/年,261元/3年,比学生9.9每月还便宜(只阿里云新用户可用)
    新用户可以入手试试,有一台属于自己的服务器,前期用来部署和学习都很方便

    阿里云 【点击购买
    在这里插入图片描述


    白嫖不好,创作不易。各位的点赞就是我创作的最大动力,如果我有哪里写的不对,欢迎评论区留言进行指正。
    老铁,如果有收获,请点个免费的赞鼓励一下博主呗

    在这里插入图片描述

    展开全文
  • Python爬虫实战之爬取网站全部图片(一)

    万次阅读 多人点赞 2018-09-02 12:28:21
    Python爬虫实战之爬取网站全部图片(二) 传送门: https://blog.csdn.net/qq_33958297/article/details/89388556 爬取网址: http://www.meizitu.com/a/more_1.html 爬取地址:...
  • 10行代码集2000张美女图,Python爬虫120例,再上征途

    万次阅读 多人点赞 2021-05-19 12:44:06
    Python爬虫120例,又来啦
  • Python爬虫案例

    万人学习 2019-09-15 16:11:56
    Python爬虫案例,Python爬虫案例,Python爬虫案例,Python爬虫案例,Python爬虫案例Python爬虫案例,Python爬虫案例Python爬虫案例Python爬虫案例Python爬虫案例Python爬虫案例
  • 原计划继续写一下关于手机APP的爬虫,结果发现夜神模拟器总是卡死,比较懒,不想找原因了,哈哈,所以接着写后面的博客了,从50篇开始要写几篇python爬虫的骚操作,也就是用Python3通过爬虫实现一些小工具。...
  • python爬虫有哪些书python有哪?下面给大家介绍6本有关爬书:更多Python书籍推荐,可以参考这篇文《想学python看哪些书》1.Python网络爬虫实战本书从Python基础开始,逐步过渡到网络爬虫,贴近实际,根据不合需求...
  • Python爬虫入门教程 99-100 Python爬虫在线服务大全

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

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

    万次阅读 多人点赞 2018-12-03 09:15:10
    Python爬虫(1):基本原理Python爬虫(2):Requests的基本用法Python爬虫(3):Requests的高级用法Python爬虫(4):Beautiful Soup的常用方法Python爬虫(5):豆瓣读书练手爬虫Python爬虫(6):煎蛋网全站妹子图爬虫Python爬虫(7...
  • Python爬虫的用途

    万次阅读 多人点赞 2018-08-16 14:02:03
    Python爬虫是用Python编程语言实现的网络爬虫,主要用于网络数据的抓取和处理,相比于其他语言,Python是一门非常适合开发网络爬虫的编程语言,大量内置包,可以轻松实现网络爬虫功能。 Python爬虫可以做的事情很多...
  • Python爬虫入门教程 90-100 凌晨5点的CSDN自动签到器,用Python爬虫干点闲事 Python爬虫入门教程 90-100 凌晨5点的CSDN自动签到器,用Python爬虫干点闲事
  • Python爬虫教程

    2018-12-11 12:01:26
    Python爬虫教程: 1、urllib、request 源码分析 2、Python爬虫案例分析 3、Scrapy爬虫框架教程
  • 一个小爬虫,爬取微信读书 书籍信息,简单揭示Python爬虫真谛
  • python 爬虫之selenium可视化爬虫

    万次阅读 多人点赞 2020-08-05 19:52:11
    一文带你了解Python爬虫(一)——基本原理介绍 一文带你了解Python爬虫(二)——四种常见基础爬虫方法介绍 之所以把selenium爬虫称之为可视化爬虫 主要是相较于前面所提到的几种网页解析的爬虫方式 selenium爬虫...
  • Python 爬虫教学网站

    千次阅读 2019-03-15 17:12:35
    From:https://piaosanlang.gitbooks.io/spiders/content/ 如何入门 python 爬虫:... Python爬虫入门教程:http://blog.csdn.net/column/details/why-bug.html Python爬虫之Selenium+Phantomjs+...
  • PYTHON爬虫

    千次阅读 多人点赞 2020-03-22 10:52:06
    PYTHON爬虫爬虫的概念通用爬虫原理聚焦爬虫——根据特定的需求,抓取指定的数据爬取步骤开发环境课程内容 爬虫的概念 爬虫可分为: 通用爬虫:百度、360、搜狐、谷歌、必应… 聚焦爬虫: 通用爬虫原理 抓取网页 ...
  • 全新顶级Python爬虫核心项目与框架实战教学,课程目的就是带领同学们做项目,做没有赘述的Python精华核心项目。课程分为了5个大的节点,分别是Python网络爬虫前奏阶段,主要是进行课程的预热以及概要和说明。第二...
  • 根据各大招聘网站的数据反馈,目前市场上对Python爬虫工程师的需求比较大。但是这并不意味着学习爬虫就好找工作了,除了熟练掌握Python爬虫技术,大家还需要许多知识,比如反爬机制、多进程、多线程爬虫等等。下面...
  • Python爬虫教程-05-python爬虫实现百度翻译

    万次阅读 多人点赞 2018-08-11 20:48:39
    使用python爬虫实现百度翻译功能 python爬虫实现百度翻译: python解释器【模拟浏览器】,发送【post请求】,传入待【翻译的内容】作为参数,获取【百度翻译的结果】 通过开发者工具,获取发送请求的地址 提示: ...
  • 32个Python爬虫项目让你一次吃到撑

    万次阅读 多人点赞 2017-08-23 15:09:07
    今天为大家整理了32个Python爬虫项目。 整理的原因是,爬虫入门简单快速,也非常适合新入门的小伙伴培养信心。所有链接指向GitHub,祝大家玩的愉快~O(∩_∩)O WechatSogou [1]- 微信公众号爬虫。基于搜狗微信搜索的...
  • Python爬虫入门教程 73-100 Python分布式爬虫顶级教程

    万次阅读 热门讨论 2020-07-10 10:55:05
    Python爬虫百例教程之 Python分布式爬虫顶级教程
  • python 爬虫实例宋城路

    2017-11-07 16:40:13
    python 爬虫实例 python 爬虫实例 python 爬虫实例 python 爬虫实例 python 爬虫实例
  • python爬虫系列版

    千次阅读 多人点赞 2018-03-16 09:57:24
    Python爬虫(1):基本原理Python爬虫(2):Requests的基本用法Python爬虫(3):Requests的高级用法Python爬虫(4):Beautiful Soup的常用方法Python爬虫(5):豆瓣读书练手爬虫Python爬虫(6):煎蛋网全站妹子图爬虫Python爬虫(7...
  • python爬虫爬取豆瓣评分数据python爬虫爬取豆瓣评分数据python爬虫爬取豆瓣评分数据python爬虫爬取豆瓣评分数据python爬虫爬取豆瓣评分数据python爬虫爬取豆瓣评分数据
  • Python爬虫系列:爬取小说并写入txt文件

    万次阅读 多人点赞 2017-07-13 17:14:51
    Python爬虫系列——爬取小说并写入txt文件 文章介绍了如何从网站中爬取小说并写入txt文件中,实现了单章节写取,整本写取,多线程多本写取。爬虫使用的python版本为python3,有些系统使用python指令运行本脚本,可能...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 306,130
精华内容 122,452
关键字:

python爬虫网站

python 订阅
爬虫 订阅