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

init.py

  1. # -*- coding: UTF- -*-
  2. # import need manager module
  3. import MongoUtil
  4. import FileUtil
  5. import conf_dev
  6. import conf_test
  7. import scratch_airport_name
  8. import scratch_flight_number
  9. import scratch_movie_name
  10. import scratch_train_number
  11. import scratch_train_station
  12. import MainUtil

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

conf_dev.py

  1. # -*- coding: UTF- -*-
  2. # the configuration file of develop environment
  3. # path configure
  4. data_root_path = 'E:/APK98_GNBJ_SMARTSERVER/Proj-gionee-data/smart/data'
  5. # mongodb configure
  6. user = "cmc"
  7. pwd = "123456"
  8. server = "localhost"
  9. port = "27017"
  10. db_name = "smartdb"

conf_test.py

  1. # -*- coding: UTF- -*-
  2. # the configuration file of test environment
  3. #path configure
  4. data_root_path = '/data/app/smart/data'
  5. #mongodb configure
  6. user = "smart"
  7. pwd = "123456"
  8. server = "10.8.0.30"
  9. port = "27017"
  10. db_name = "smartdb"

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

FileUtil.py

  1. # -*- coding: UTF- -*-
  2. import conf_dev
  3. import conf_test
  4. import platform
  5. # configure Multi-confronment
  6. # 判断当前系统,并引入相对的配置文件
  7. platform_os = platform.system()
  8. config = conf_dev
  9. if (platform_os == 'Linux'):
  10. config = conf_test
  11. # path
  12. data_root_path = config.data_root_path
  13. # load old data
  14. def read(resources_file_path, encode='utf-8'):
  15. file_path = data_root_path + resources_file_path
  16. outputs = []
  17. for line in open(file_path, encoding=encode):
  18. if not line.startswith("//"):
  19. outputs.append(line.strip('\n').split(',')[-1])
  20. return outputs
  21. # append new data to file from scratch
  22. def append(resources_file_path, data, encode='utf-8'):
  23. file_path = data_root_path + resources_file_path
  24. with open(file_path, 'a', encoding=encode) as f:
  25. f.write(data)
  26. f.close

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

MainUtil.py

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

将更新的内容插入mongodb中

MongoUtil.py

  1. # -*- coding: UTF- -*-
  2. import platform
  3. from pymongo import MongoClient
  4. from datetime import datetime, timedelta, timezone
  5. import conf_dev
  6. import conf_test
  7. # configure Multi-confronment
  8. platform_os = platform.system()
  9. config = conf_dev
  10. if (platform_os == 'Linux'):
  11. config = conf_test
  12. # mongodb
  13. uri = 'mongodb://' + config.user + ':' + config.pwd + '@' + config.server + ':' + config.port + '/' + config.db_name
  14. # 将数据写入mongodb
  15. # @author chenmc
  16. # @param uri connect to mongodb
  17. # @path save mongodb field
  18. # @data save mongodb field
  19. # @operation save mongodb field default value 'append'
  20. # @date // :
  21. # 先在mongodb中插入一条自增数据 db.sequence.insert({ })
  22. def insert(path, data, operation='append'):
  23. client = MongoClient(uri)
  24. resources = client.smartdb.resources
  25. sequence = client.smartdb.sequence
  26. seq = sequence.find_one({"_id": "version"})["seq"] #获取自增id
  27. sequence.update_one({}}) #自增id+
  28. post_data = {"_class": "com.gionee.smart.domain.entity.Resources", "version": seq, "path": path,
  29. "content": data, "status": "enable", "operation": operation,
  30. )))}
  31. resources.insert(post_data) #插入数据

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

requirements.txt

  1. # need to install module# need to install module
  2. bs4
  3. pymongo
  4. requests
  5. json

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

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

scratch_airport_name.py:爬取全国机场

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

scratch_flight_number.py:爬取全国航班号

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

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

  1. #!/usr/bin/python
  2. # -*- coding: UTF- -*-
  3. import re
  4. import requests
  5. import bs4
  6. import json
  7. import MainUtil
  8. # 相对路径,也是需要将此路径存入数据库
  9. resources_file_path = '/resources/movie/cinemaNameList.ini'
  10. scratch_url = 'http://theater.mtime.com/China_Beijing/'
  11. # scratch data with define url
  12. def scratch_latest_movies(scratch_url, old_movies):
  13. data = requests.get(scratch_url).text
  14. soup = bs4.BeautifulSoup(data, "html.parser")
  15. new_movies = []
  16. new_movies_json = json.loads(
  17. soup.find(].replace(";", ""))
  18. coming_movies_data = soup.find_all('li', class_='i_wantmovie')
  19. # 上映的电影
  20. for movie in new_movies_json:
  21. move_name = movie['Title']
  22. if move_name not in old_movies:
  23. new_movies.append(movie['Title'])
  24. # 即将上映的电影
  25. for coming_movie in coming_movies_data:
  26. coming_movie_name = coming_movie.h3.a.text
  27. if coming_movie_name not in old_movies and coming_movie_name not in new_movies:
  28. new_movies.append(coming_movie_name)
  29. return new_movies
  30. if __name__ == '__main__':
  31. MainUtil.main(resources_file_path, scratch_url, scratch_latest_movies)

scratch_train_number.py:爬取全国列车号

  1. #!/usr/bin/python
  2. # -*- coding: UTF- -*-
  3. import requests
  4. import bs4
  5. import json
  6. import MainUtil
  7. resources_file_path = '/resources/train/trainNameList.ini'
  8. scratch_url = 'http://www.59178.com/checi/'
  9. def scratch_train_number(scratch_url, old_trains):
  10. new_trains = []
  11. resp = requests.get(scratch_url)
  12. data = resp.text.encode(resp.encoding).decode('gb2312')
  13. soup = bs4.BeautifulSoup(data, "html.parser")
  14. a_trains = soup.find('table').find_all('a')
  15. for train in a_trains:
  16. if train.text not in old_trains and train.text:
  17. new_trains.append(train.text)
  18. return new_trains
  19. if __name__ == '__main__':
  20. MainUtil.main(resources_file_path, scratch_url, scratch_train_number)

scratch_train_station.py:爬取全国列车站

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

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

/etc/crontab

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

后续

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

有问题反馈

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

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

关于此公众号

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

Python爬虫入门项目的更多相关文章

  1. Python爬虫入门一之综述

    大家好哈,最近博主在学习Python,学习期间也遇到一些问题,获得了一些经验,在此将自己的学习系统地整理下来,如果大家有兴趣学习爬虫的话,可以将这些文章作为参考,也欢迎大家一共分享学习经验. Pyth ...

  2. 1.Python爬虫入门一之综述

    要学习Python爬虫,我们要学习的共有以下几点: Python基础知识 Python中urllib和urllib2库的用法 Python正则表达式 Python爬虫框架Scrapy Python爬虫 ...

  3. 转 Python爬虫入门一之综述

    转自: http://cuiqingcai.com/927.html 静觅 » Python爬虫入门一之综述 首先爬虫是什么? 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为 ...

  4. Python爬虫入门(二)之Requests库

    Python爬虫入门(二)之Requests库 我是照着小白教程做的,所以该篇是更小白教程hhhhhhhh 一.Requests库的简介 Requests 唯一的一个非转基因的 Python HTTP ...

  5. python爬虫入门-开发环境与小例子

    python爬虫入门 开发环境 ubuntu 16.04 sublime pycharm requests库 requests库安装: sudo pip install requests 第一个例子 ...

  6. Python爬虫入门教程 48-100 使用mitmdump抓取手机惠农APP-手机APP爬虫部分

    1. 爬取前的分析 mitmdump是mitmproxy的命令行接口,比Fiddler.Charles等工具方便的地方是它可以对接Python脚本. 有了它我们可以不用手动截获和分析HTTP请求和响应 ...

  7. Python爬虫入门教程 43-100 百思不得姐APP数据-手机APP爬虫部分

    1. Python爬虫入门教程 爬取背景 2019年1月10日深夜,打开了百思不得姐APP,想了一下是否可以爬呢?不自觉的安装到了夜神模拟器里面.这个APP还是比较有名和有意思的. 下面是百思不得姐的 ...

  8. Python 爬虫入门(二)——爬取妹子图

    Python 爬虫入门 听说你写代码没动力?本文就给你动力,爬取妹子图.如果这也没动力那就没救了. GitHub 地址: https://github.com/injetlee/Python/blob ...

  9. Python爬虫入门之正则表达式

    在前面我们已经搞定了怎样获取页面的内容,不过还差一步,这么多杂乱的代码夹杂文字我们怎样把它提取出来整理呢?下面就开始介绍一个十分强大的工具,正则表达式! 1.了解正则表达式 正则表达式是对字符串操作的 ...

随机推荐

  1. Scrapyd 改进第一步: Web Interface 添加 charset=UTF-8, 避免查看 log 出现中文乱码

    0.问题现象和原因 如下图所示,由于 Scrapyd 的 Web Interface 的 log 链接直接指向 log 文件,Response Headers 的 Content-Type 又没有声明 ...

  2. js过滤html标签

    function deleteHtmlTag(str){ str = str.replace(/<[^>]+>|&[^>]+;/g,"").trim ...

  3. JMeter关联的几种方式总结案例

    1.接口响应结果,通常为HTML.JSON格式的数据,对于HTML的响应结果的提取,可以通过正则表达式,也可以通过XPath 来提取. 2.对于JSON格式的数据,可以通过正则表达式.JSON Ext ...

  4. MSSql-1内部数据库版本号

    源SQL Server版本 内部数据库版本 SQL Server 2017 869 SQL Server 2016 782 SQL Server 2012 706 SQL Server 2008 R2 ...

  5. 为什么 kubernetes 天然适合微服务

    最近总在思考,为什么在支撑容器平台和微服务的竞争中,Kubernetes 会取得最终的胜出,事实上从很多角度出发三大容器平台从功能方面来看,最后简直是一摸一样.(可参考<容器平台选型的十大模式: ...

  6. vue笔记-列表渲染

    用v-for把一个数组对应为一组元素 使用方法:v-for="(item,index) in items"//也可以使用of替代in { items:源数组 item:数组元素迭代 ...

  7. 实现ssr服务端渲染

    前言 前段时间寻思做个个人网站,然后就立马行动了.  个人网站如何实现选择什么技术方案,自己可以自由决定.  刚好之前有大致想过服务端渲染,加载速度快,还有 SEO 挺适合个人网站的.  所以就自己造 ...

  8. Tomcat 配置文件server.xml详解

    前言 Tomcat隶属于Apache基金会,是开源的轻量级Web应用服务器,使用非常广泛.server.xml是Tomcat中最重要的配置文件,server.xml的每一个元素都对应了Tomcat中的 ...

  9. That girl

    音标 词汇 Purple Glasses Black Hat Brown Bag Clothes Blue Jacket Pink Handbag Sock White Skirt Shoe 1, s ...

  10. VMware Workstation安装Red hat7.0联网问题总结

    1.在red hat7当中iconfig命令是被取消了的,开发者用ip addr命令取代了ifconfig命令. 当然也是可以用ifconfig命令的 (前提是你安装的linux是可以联网的): 1) ...