入门-人生苦短,快学Python

内容纲要

Python 基础应用小结

对Python应用的初步打算是用来刷Acm题目的,C++和Python代码一式一份
但是学完了Python语法感觉还挺有意思,简单实践了一下网络编程、PyMySQL、爬虫模块的基础

Python 网络编程

该模块需要额外安装模块socket,pip安装就可以了
pip install requests
我的同时安装Python2和Python3版本,还需要执行以下代码
python3 -m pip install requests

服务端先运行,然后打开另一个终端运行客户端

Client 客户端

# 文件名:sample_client.py

import socket
import sys

# 创建socket对象
s = socket.socket(
    socket.AF_INET,socket.SOCK_STREAM)

# 获取本地主机名
host = socket.gethostname()
port = 9999

# 连接服务,指定主机和端口
s.connect((host,port))

# 接收小于1024字节的数据
msg = s.recv(1024)

s.close()

print(msg.decode('utf-8'))

服务端 Server

# python3
# 文件名:server.py
import socket
import sys

# 创建 socket 对象
serversocket = socket.socket(
    socket.AF_INET,socket.SOCK_STREAM)

# 获取本地主机名
host = socket.gethostname()

port = 9999
# 绑定端口
serversocket.bind((host,port))

# 设置最大连接数,超过后排队
serversocket.listen(5)
while True:
    # 建立客户端连接
    clientsock,addr = serversocket.accept()
    print("连接地址: %s" %  str(addr))

    msg = '欢迎访问!' + "\r\n"
    clientsock.send(msg.encode('utf-8'))
    clientsock.close()

简单连接MySQL数据库

相应地,要安装pymysql模块
pip install mysql

# 导入pyMysql模块
import pymysql
# 创建数据库连接对象db
db = pymysql.connect('localhost','root','3015','test')
# 创建db的游标对象cx
cx = db.cursor()
# 查看MySQL数据版本
versionSql = 'SELECT VERSION()'
# 查询2017_Students表中Sno<200的所有记录
sql = 'SELECT * FROM 2017_Students WHERE Sno < %d' % (200)  
try:
    # cx执行MySQL语句
    cx.execute(versionSql)
    # fetchone()获取单条结果行
    data = cx.fetchone()
    print("MySQL Version is %s" % data)
    # cx执行MySQL查询语句
    cx.execute(sql)
    # 获取全部的返回结果行
    results = cx.fetchall()
    # 遍历输出获取的结果行
    for row in results:
        stu_id = row[0]
        stu_num = row[1]
        stu_name = row[2]
        stu_sex = row[3]
        print("序号: %d,学号: %s,姓名: %s,性别: %s" % \
            (stu_id,stu_num,stu_name,stu_sex))
    # 当对数据库进行更改操作时,需要
    # db.commit()
except:
    print('Error: Unable to fetch any data!')
    # 当对数据库进行更改操作时,需要
    # db.rollback()
db.close()

爬虫入门

相应地,要安装requests模块
pip install requests

发起HTTP请求获取网页信息

# -*- coding:UTF-8 -*-
# 实例1:获取url的html信息

# 导入requests模块
import requests
# 目标地址target
target = 'https://maoyan.com/board'
# 返回一个名为
req = requests.get(url = target)
# 输出html的文本信息
print(req.text)

简单的反爬虫

上述代码:
若服务器检测到是代码访问而不是浏览器发出的请求
有的网站开发者会用反爬虫程序防止爬虫
为应对这类反爬程序,采取反反爬操作
即:模拟浏览器的身份对网站进行访问

获取本地浏览器的身份信息

打开本地浏览器:如FireFox火狐浏览器
打开任意网页(如百度)

该步骤是为了发起任意HTTP请求,浏览器会接收返回对象
而我们希望找的浏览器身份就在这个对象里

按下F12调出浏览器后台,点击
浏览器身份信息
拷贝右下角那一串信息,这就是我们需要的
接着只需要在上述代码中添加两句:
header = {'User agent':'Mozilla/5.0......等等字符'}
并将get函数改为req = requests.get(url = target,headers = header)

实现代码:

# -*- coding:UTF-8 -*-
# 实例2:最简单的反爬虫

# 导入requests模块
import requests

def getOnePage(n):
    # 模拟浏览器身份进行访问    字典{}
    header = {
        'User agent':'Mozilla/5.0...太长'
    }
    # 目标地址target    格式化字符串
    target = f'https://maoyan.com/board/{n}'
    # 返回一个名为
    req = requests.get(url = target,headers = header)
    # 返回html的文本信息
    return req.text
data = getOnePage(1)
print(data)

获取猫眼榜单的电影名称和上映日期

# -*- coding:UTF-8 -*-
# 实例3:爬取猫眼榜单上的电影名称

# 导入requests模块
import requests
# 导入解析html,xml的xml路径语言库
from lxml import etree
# 导入json
import json
# 获取单个页面的html信息
def getOnePage(n):
    # 模拟浏览器身份进行访问    字典{}
    header = {
        'User agent':'Mozilla/5.0...太长'
    }
    # 目标地址target    格式化字符串
    target = f'https://maoyan.com/board/{n}'
    # 返回一个名为
    req = requests.get(url = target,headers = header)
    # 返回html的文本信息
    return req.text
# 获取所提取html信息的迭代对象
def prase(text):
    # 初始化获取的文本
    html = etree.HTML(text)
    # 根据页面结构获取需要的信息
    names = html.xpath('//dd/a/@title')
    realeasetimes = html.xpath('//p[@class = "releasetime"]/text()')
    # item 字典保存每个项
    item = dict()
    # zip函数(打包)/zipped函数(解包)
    for name,realeasetime in zip(names,realeasetimes):
        item['name'] = name
        item['releasetime'] = realeasetime
        # 生成器
        yield item
# 保存数据到本地文件
def save2file(data):
    with open('movie.json','a',encoding = 'utf-8') as f:
        # 把data从 字典/列表 转换成字符串
        data = json.dumps(data,ensure_ascii=False) + ',\n'
        # 将data字符串写入文件f
        f.write(data)
# 运行函数
def runGetMovies():
    # 根据网页结构,得到各榜单地址后缀分别为7,6,1,2,4
    pageList = [7,6,1,2,4]
    for i in pageList:
        data = getOnePage(i)
        items = prase(data)
        for item in items:
            save2file(item)
if __name__ == "__main__":
    runGetMovies()

猫眼榜单电影


One Comments

  • RJman

    2019年8月20日

    再次测试下评论 {{se}}

    Reply

发表评论