Python爬虫学习笔记

一、Python的基本知识

Python环境安装

  1. 打开主页https://www.python.org/,下载Python3.8。
  2. 打开https://www.jetbrains.com/pycharm/,下载pychar。
  3. 安装配置开发环境Python3.8时,选择定制安装,并将Add Python3.8 To Path选中。
  4. 安装pychar时,选中Add Python to environment variables。
  5. 设置环境变量path和python,path变量增加两个目录,一个为Python.exe所在目录,一个为该目录下的Scripts目录。
  6. pychar设置,File–>settings–>editor–>File and Code Templates–>Python File增加下列内容
#-*- codeing = uft-8 -*-
#@Time : ${DATE} ${TIME}
#@Author : Lwp
#@File : ${NAME}.py
#@Softwore : ${PRODUCT_NAME}

判断语句和循环语句

  1. if、 for 、while 基本语法
age=18
if age>1:
    print("你的年龄大于%d"%age)
else:
    print("你的年龄小于%d"%age)
for i in range(1,13,2):
    print(i)
i=0
while i<5:
    print("当前是第%d次执行循环"%(i+1))
    print("i=%d"%i)
    i += 1    
  1. break中断整个循环、continue跳出当前循环、pass空语句,站位

字符串

  1. 反斜杠\转义符的应用: \\ 代表反斜杠 \ '代表单引号 \" 代表双引号
  2. r"ni hao \n chongqing",字符串前面加r表示字符串内容原封不动保留,不会再转义。
  3. 字符串乘法的应用 如:打印结果为”lwplwplwp“
print("lwp"*3)
  1. 字符串常见操作
    capitalize()、encode(encoding=“utf-8”,errors=‘strict’)、count()、isalnum()、isdigit()、join()、lstrip()、rstrip()、split()等

常用数据结构:列表、元组、集合、字典

  1. 列表
    列表可以完成大多数集合类的数据结构,列表可以嵌套;
    列表索引值以0开始,-1为末尾开始;
    列表的增加成员操作:append、extend、insert
    列表的删除操作:del、remove、pop
    列表的修改操作:通过列表下标修改,如:list[8]=9,将列表下标为8的成员内容改为9
    列表的查询操作:in,not in
    列表的排序操作:sort、reverse
  2. 元组
    元组特点:元素不能修改、可以包括可变对象如列表(‘a’,‘b’,[‘aa’,‘bb’])
    元组的常见操作:通过下标访问,通过for循环遍历,使用[::]tuple1=[5:3:2]切片,+、in、count、len、max、min、tuple等操作
  3. 字典
    字典特点:无序、键值对(key-value),键(key)必须不可变、唯一,值(value)可变;
    字典常见操作:遍历所有键keys()、遍历所有值values()、items()遍历所有项、get访问元素、key值访问元素、dict+zip将两个列表转为字典、clear清除字典内容、del、pop、update等
ll={"name":"lwp","age":18,"sex":"man"}
for key,value in ll.items():
    print(key,value)
  1. 集合
    集合特点:与字典类似、只是键(key)的组合,无值(value),不能重复,无序
    集合常见操作:for遍历、update、add、remove、pop、clear、del

函数、文件操作、 异常处理

  1. 函数的格式、分类、调用,变量的作用域局部变量和全局变量。
  2. 文件的相关知识:文件的打开(open)模式r、w、a、rb、wb、ab、r+、w+,文件的关闭(close),文件的读取read、readline、readlines,通过引入os(import os)可以进行文件的重命名rename、文件的删除remove、创建文件夹mkdir、获取当前目录getcwd等。
  3. 异常处理相关知识:
    语法:try : except 错误类型 : 执行语句 finally : 语句。
    finally 代码无论是否发生错误,均会执行;exception as result可以承接任何错误;异常处理可以嵌套。

二、爬虫的技术实现

urlib库的使用

  1. 引入系统模块:import os import sys 。
  2. 引入自定义包:from test1 import l1,自己开发一个test1的包(目录)包含l1.py的一个文件,将其引入到当前程序中,以便调用l1.py中的函数或方法。
  3. 引入第三方模块:
    在命令行运行Python,再输入pip bs4,可以下载并安装bs4库;
    通过pychar安装第三方报:file–>setting–>project 具体项目–>Python interpreter,点击左下角的”+“来添加第三方包。
  4. httpbin.org,测试http和https
  5. 获取一个get请求
import urllib.request
respone=urllib.request.urlopen("http://httpbin.org/get")
print(respone.read().decode("utf-8"))
  1. 获取一个post请求,必须按照post方式封装数据,用于网站模拟用户真实登录
import urllib.request
import urllib.parse
try:
    data=bytes(pp.urlencode({"hellow":"word"}),encoding="utf-8")
    respone=urllib.request.urlopen("http://httpbin.org/post",data=data,timeout=1)
    print(respone.read().decode("utf-8"))
    print(respone.status) #返回访问状态
    print(respone.headers) #返回响应头
except urllib.error.URLError as e:
    print("time out")

运行结果

D:\python\PycharmProjects\pythonProject\venv\Scripts\python.exe C:/Users/Administrator/PycharmProjects/pythonProject/lwp/1.py
{
  "args": {}, 
  "data": "", 
  "files": {}, 
  "form": {
    "hellow": "word"
  }, 
  "headers": {
    "Accept-Encoding": "identity", 
    "Content-Length": "11", 
    "Content-Type": "application/x-www-form-urlencoded", 
    "Host": "httpbin.org", 
    "User-Agent": "Python-urllib/3.8", 这儿代表是用的爬虫工具,非浏览器访问的网页
    "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:47.0) Gecko/20100101 Firefox/47.0", 
   注释:上行是用浏览器访问的,有些网页禁止爬虫工具,而我们又必须Python访问时,就要传入该参数,模拟浏览器访问
    "X-Amzn-Trace-Id": "Root=1-60545d33-3c35c2646e4869cc011a681c"
  }, 
  "json": null, 
  "origin": "61.128.167.30", 
  "url": "http://httpbin.org/post"
}
Process finished with exit code 0
200 注释:200代表成功返回,404代表网页不存在,418代表不影响爬虫工具访问
  1. 测试伪装浏览器访问
import urllib.request
import urllib.parse
url = "http://httpbin.org/post"
data = bytes(urllib.parse.urlencode({'name':'lwp'}),encoding="utf-8")
headers = {"User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:47.0) Gecko/20100101 Firefox/47.0"}
req = urllib.request.Request(url=url,data=data,headers=headers,method='POST')  #post必须大写
response = urllib.request.urlopen(req)
print(response.read().decode("utf-8"))

模拟浏览器访问豆瓣

url = "https://www.douban.com"
headers = {"User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:47.0) Gecko/20100101 Firefox/47.0"}
req = urllib.request.Request(url=url,headers=headers)
response = urllib.request.urlopen(req)
print(response.read().decode("utf-8"))
  1. beautifulSoup4的用法
    beautifulSoup4是将复杂html文档转化为一个复杂的树形结构,每个节点都是Python对象,所有对象可归纳成4种
  • Tag 标签及其内容
  • NavigableString 标签里的内容(字符串)
  • BeautifulSoup 表示整个文档
  • Comment 是一个特殊的NavigableString,输出内容不包含注释符号
from bs4 import  BeautifulSoup  #  引入 BeautifulSoup
import re #  引入 正则表达式

file = open("./baidu.html","rb")
html = file.read().decode("utf-8")
bs = BeautifulSoup(html,"html.parser")

# 遍历find_all("A"),查找与字符串A完全匹配的字符串
# 使用正则表达式
t_list = bs.find_all('a')
t_list = bs.find_all(re.compile('a'))
# 定义一个函数来查找
 def name_is_exists(tag):
     return tag.has_attr("name")
  t_list = bs.find_all(name_is_exists)
# kwars 参数
t_list = bs.find_all('a',limit=3) 
#  选择器  .表示类(class),#表示id(id)
 t_list = bs.select(".nav")
 t_list = bs.select("#logo")
 t_list = bs.select("p[class='story']") # 通过属性来查找
 t_list = bs.select("head > title") # 通过子标签来查找

t_list = bs.select(".nav") # 通过子标签来查找
for item in t_list:
    print(item.get_text)

正则表达式

  1. 常见语法
    ^ 表示匹配字符串的开始位置 (例外 用在中括号中[ ] 时,可以理解为取反,表示不匹配括号中字符串)
    $ 表示匹配字符串的结束位置 * 表示匹配 零次到多次 + 表示匹配 一次到多次 (至少有一次)
    ? 表示匹配零次或一次
    . 表示匹配单个字符
    | 表示为或者,两项中取一项
    ( ) 小括号表示匹配括号中全部字符
    [ ] 中括号表示匹配括号中一个字符 范围描述 如[0-9 a-z A-Z]
    { } 大括号用于限定匹配次数 如 {n}表示匹配n个字符 {n,}表示至少匹配n个字符 {n,m}表示至少n,最多m
    \ 转义字符 如上基本符号匹配都需要转义字符 如 * 表示匹配*号
    \w 表示英文字母和数字 \W 非字母和数字
    \d 表示数字 \D 非数
  2. 常用函数
    search(),match(),findall(),split(),sub()
  3. 常识
    re.l 忽略大小写,re.S使.匹配包括换行符在内的所有字符,a=r"dsfes\a.sdas/fds\n" # 字符串前加r表示忽略转义符

xlwt对Excel的操作

  1. 导入包:import xlwt
  2. 创建workbook对象:book = xlwt.Workbook(encoding=“utf-8”,style_compression=0)
  3. 创建工作表:sheet = book.add_sheet(“豆瓣电影top250”,cell_overwrite_ok=True)
  4. 向工作表中写数据:sheet.write(i1+1, j, data[j])
  5. 保存到文件中:book.save(savepath)

SQlite数据库

  1. 引入报:import sqlite3
  2. 打开或创建数据库文件:comn = sqlite3.connect(“test.db”)
  3. 获取游标:c = comn.cursor()
  4. 执行sql语句:c.execute(sql)
  5. 提交数据库操作:comn.commit()
  6. 关闭数据库连接:comn.close()

三、数据可视化的技术应用

Flask框架入门

  1. Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收http请求并对请求进行预处理,然后触发Flask框架,开发人员基于Flask框架提供的功能对请求进行相应的处理,并返回给用户,如果要返回给用户复杂的内容时,需要借助jinja2模板来实现对模板的处理,即:将模板和数据进行渲染,将渲染后的字符串返回给用户浏览器。
  2. 其 WSGI 工具箱采用 Werkzeug(路由模块),模板引擎则使用 Jinja2。这两个也是 Flask 框架的核心。
  3. 默认情况下,Flask 不包含数据库抽象层、表单验证,或是其它任何已有多种库可以胜任的功能。然而,Flask 支持用扩展来给应用添加这些功能,如同是 Flask 本身实现的一样。众多的扩展提供了数据库集成、表单验证、上传处理、各种各样的开放认证技术等功能。Flask 也许是“微小”的,但它已准备好在需求繁杂的生产环境中投入使用。
  4. 基本路由系统
    •@app.route(‘/user/’)
    •@app.route(‘/post/int:post_id’)
    •@app.route(‘/post/float:post_id’)
    •@app.route(‘/post/path:path’)
    •@app.route(‘/login’, methods=[‘GET’, ‘POST’])
  5. 路由解析:通过用户访问的路径,匹配相应的函数,路由路径不能重复,用户通过唯一路径访问特定函数,参数类型不一样,则也认为是不重复的。
  6. 打开debug模式:点击右上角Flask(app.py)下箭头,选择Edit Configurations,勾选FLASK_DEBUG,重启服务。
  7. render_template渲染,向HTML文件传递参数,{%%}控制结构如for循环、if语句等,{{}}使用传递来的变量,字典中的键值对,需要用迭代items()函数。
  8. 表单提交:name为key,输入的值为value;url_for(‘result’)反向解析URL地址。
  9. 一段简单代码:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
    return 'Hello World!'
if __name__ == '__main__':
    app.run()

Echarts的应用

  1. 基本语法
    第一步:创建 HTML 页面
    创建一个 HTML 页面,引入 echarts.min.js:
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <!-- 引入 ECharts 文件 -->
    <script src="echarts.min.js"></script>
</head>
</html>

第二步: 为 ECharts 准备一个具备高宽的 DOM 容器
实例中 id 为 main 的 div 用于包含 ECharts 绘制的图表:

<body>
    <!-- 为 ECharts 准备一个具备大小(宽高)的 DOM -->
    <div id="main" style="width: 600px;height:400px;"></div>
</body>

第三步: 设置配置信息
ECharts 库使用 json 格式来配置。

echarts.init(document.getElementById('main')).setOption(option);

这里 option 表示使用 json 数据格式的配置来绘制图表。步骤如下:

标题

为图表配置标题:

title: {
    text: '第一个 ECharts 实例'
}

提示信息

配置提示信息:

tooltip: {},

图例组件

图例组件展现了不同系列的标记(symbol),颜色和名字。可以通过点击图例控制哪些系列不显示。

legend: {
    data: [{
        name: '系列1',
        // 强制设置图形为圆。
        icon: 'circle',
        // 设置文本为红色
        textStyle: {
            color: 'red'
        }
    }]
}

X 轴,配置要在 X 轴显示的项:

xAxis: {
    data: ["衬衫","羊毛衫","雪纺衫","裤子","高跟鞋","袜子"]
}

Y 轴,在 Y 轴显示的项。

yAxis: {}

系列列表

每个系列通过 type 决定自己的图表类型:

series: [{
    name: '销量',  // 系列名称
    type: 'bar',  // 系列图表类型
    data: [5, 20, 36, 10, 10, 20]  // 系列中的数据内容
}]

每个系列通过 type 决定自己的图表类型:

type: ‘bar’:柱状/条形图
type: ‘line’:折线/面积图
type: ‘pie’:饼图
type: ‘scatter’:散点(气泡)图
type: ‘effectScatter’:带有涟漪特效动画的散点(气泡)
type: ‘radar’:雷达图
type: ‘tree’:树型图
type: ‘treemap’:树型图
type: ‘sunburst’:旭日图
type: ‘boxplot’:箱形图
type: ‘candlestick’:K线图
type: ‘heatmap’:热力图
type: ‘map’:地图
type: ‘parallel’:平行坐标系的系列
type: ‘lines’:线图
type: ‘graph’:关系图
type: ‘sankey’:桑基图
type: ‘funnel’:漏斗图
type: ‘gauge’:仪表盘
type: ‘pictorialBar’:象形柱图
type: ‘themeRiver’:主题河流
type: ‘custom’:自定义系列

  1. 完整实例代码
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>第一个 ECharts 实例</title>
    <!-- 引入 echarts.js -->
    <script src="https://cdn.staticfile.org/echarts/4.3.0/echarts.min.js"></script>
</head>
<body>
    <!-- 为ECharts准备一个具备大小(宽高)的Dom -->
    <div id="main" style="width: 600px;height:400px;"></div>
    <script type="text/javascript">
        // 基于准备好的dom,初始化echarts实例
        var myChart = echarts.init(document.getElementById('main'));
 
        // 指定图表的配置项和数据
        var option = {
            title: {
                text: '第一个 ECharts 实例'
            },
            tooltip: {},
            legend: {
                data:['销量']
            },
            xAxis: {
                data: ["衬衫","羊毛衫","雪纺衫","裤子","高跟鞋","袜子"]
            },
            yAxis: {},
            series: [{
                name: '销量',
                type: 'bar',
                data: [5, 20, 36, 10, 10, 20]
            }]
        };
        // 使用刚指定的配置项和数据显示图表。
        myChart.setOption(option);
    </script>
</body>
</html>

Wordcloud的应用

  1. 简介
    wordcloud库,可以说是python非常优秀的词云展示第三方库。词云以词语为基本单位更加直观和艺术的展示文本。
    wordcloud做词频统计分为以下几个步骤:
    (1)、分隔:以空格分隔单词
    (2)、统计 :单词出现的次数并过滤
    (3)、字体:根据统计搭配相应的字号
    (4) 、布局

  2. 参数含义:
    font_path : string #字体路径,需要展现什么字体就把该字体路径+后缀名写上,如:font_path = ‘黑体.ttf’
    width : int (default=400) #输出的画布宽度,默认为400像素
    height : int (default=200) #输出的画布高度,默认为200像素
    prefer_horizontal : float (default=0.90) #词语水平方向排版出现的频率,默认 0.9 (所以词语垂直方向排版出现频率为 0.1 )
    mask : nd-array or None (default=None) #如果参数为空,则使用二维遮罩绘制词云。如果 mask 非空,设置的宽高值将被忽略,遮罩形状被 mask 取代。除全白(#FFFFFF)的部分将不会绘制,其余部分会用于绘制词云。如:bg_pic = imread(‘读取一张图片.png’),背景图片的画布一定要设置为白色(#FFFFFF),然后显示的形状为不是白色的其他颜色。可以用ps工具将自己要显示的形状复制到一个纯白色的画布上再保存,就ok了。
    scale : float (default=1) #按照比例进行放大画布,如设置为1.5,则长和宽都是原来画布的1.5倍
    min_font_size : int (default=4) #显示的最小的字体大小
    font_step : int (default=1) #字体步长,如果步长大于1,会加快运算但是可能导致结果出现较大的误差
    max_words : number (default=200) #要显示的词的最大个数
    stopwords : set of strings or None #设置需要屏蔽的词,如果为空,则使用内置的STOPWORDS
    background_color : color value (default=”black”) #背景颜色,如background_color=‘white’,背景颜色为白色
    max_font_size : int or None (default=None) #显示的最大的字体大小
    mode : string (default=”RGB”) #当参数为“RGBA”并且background_color不为空时,背景为透明
    relative_scaling : float (default=.5) #词频和字体大小的关联性
    color_func : callable, default=None #生成新颜色的函数,如果为空,则使用 self.color_func
    regexp : string or None (optional) #使用正则表达式分隔输入的文本
    collocations : bool, default=True #是否包括两个词的搭配
    colormap : string or matplotlib colormap, default=”viridis” #给每个单词随机分配颜色,若指定color_func,则忽略该方法random_state : int or None #为每个单词返回一个PIL颜色

    fit_words(frequencies) #根据词频生成词云
    generate(text) #根据文本生成词云
    generate_from_frequencies(frequencies[, …]) #根据词频生成词云
    generate_from_text(text) #根据文本生成词云
    process_text(text) #将长文本分词并去除屏蔽词(此处指英语,中文分词还是需要自己用别的库先行实现,使用上面的 fit_words(frequencies) )
    recolor([random_state, color_func, colormap]) #对现有输出重新着色。重新上色会比重新生成整个词云快很多
    to_array() #转化为 numpy array
    to_file(filename) #输出到文件

  3. 简单代码

#!/usr/bin/python
# -*- coding: utf-8 -*-
#coding=utf-8

#导入wordcloud模块和matplotlib模块
from wordcloud import WordCloud
import matplotlib.pyplot as plt
from scipy.misc import imread

#读取一个txt文件
text = open('test.txt','r').read()

#读入背景图片
bg_pic = imread('3.png')

#生成词云
wordcloud = WordCloud(mask=bg_pic,background_color='white',scale=1.5).generate(text)
image_colors = ImageColorGenerator(bg_pic)

#显示词云图片
plt.imshow(wordcloud)
plt.axis('off')
plt.show()
#保存图片
wordcloud.to_file('test.jpg')

学习中用到的代码

  1. 完整获取豆瓣网络信息的代码
# -*- codeing = uft-8 -*-
# @Time : 2021-3-22 9:40
# @Author : Lwp
# @File : 2.py.py
# @Softwore : PyCharm

import re
from bs4 import BeautifulSoup
import urllib.request
import urllib.error
import urllib3.request
import xlwt
import sqlite3

def main():
    baseurl = "https://movie.douban.com/top250?start="
    datalist = getdata(baseurl)
    savepath = "Db250.xls"
    savedata(datalist,savepath)

# 影片详情链接的规则
findLink = re.compile(r'<a href="(.*?)">') # 创建正则表达式对象,表示规则或字符串模式
# 影片图片的规则
findImgSrc = re.compile(r'<img.*src="(.*?)"',re.S) # 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 getdata(baseurl):
    datalist = []
    for i in range(0,10):
        # 获取网页
        url = baseurl+str(i*25)
        html = askURL(url)
        # 逐一解析
        soup = BeautifulSoup(html,"html.parser")
        for item in soup.find_all('div',class_="item"):
            # print(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)    # 去掉<br/>
            bd = re.sub('/'," ",bd)      # 去掉/
            data.append(bd.strip())      # 去掉空格

            datalist.append(data)        # 将处理好的一部电影放入datalist
    print(datalist)
    return datalist

# 得到一个指定URL网页内容的函数
def askURL(url):
    # 头部信息:模拟浏览器头部信息,向服务器发送消息。
    # 用户代理,告诉豆瓣服务器我们是什么类型的机器,我们可以接受什么水平的文件内容
    head = {"User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:47.0) Gecko/20100101 Firefox/47.0"}
    request=urllib.request.Request(url,headers=head)
    html=""
    try:
        response = urllib.request.urlopen(request)
        html = response.read().decode("utf-8")
        #print(html)
    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("lwp")
    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 i1 in range(0,250) :
        print("这是第%d部电影"%(i1+1))
        data = datalist[i1]
        for j in range(0,8):
            sheet.write(i1+1, j, data[j])

    book.save(savepath)    #保存数据

if __name__ == "__main__":
    main()
  1. 伪装浏览器方式爬取网页
# -*- codeing = uft-8 -*-
# @Time : 2021-3-19 10:47
# @Author : Lwp
# @File : 1.py
# @Softwore : PyCharm

# 获取一个get请求
# import urllib.request
# respone=urllib.request.urlopen("http://httpbin.org/get")
# print(respone.read().decode("utf-8"))

#获取一个post请求
# import urllib.request
# import urllib.parse as pp
# try:
#     data=bytes(pp.urlencode({"hellow":"word"}),encoding="utf-8")
#     respone=urllib.request.urlopen("http://httpbin.org/post",data=data,timeout=1)
#     print(respone.read().decode("utf-8"))
#     print(respone.status) #返回访问状态
#     print(respone.headers) #返回响应头
# except urllib.error.URLError as e:
#     print("time out")

#测试伪装浏览器访问
import urllib.request
import urllib.parse
url = "https://www.douban.com"
data = bytes(urllib.parse.urlencode({'name':'lwp'}),encoding="utf-8")
headers = {"User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:47.0) Gecko/20100101 Firefox/47.0"}
req = urllib.request.Request(url=url,data=data,headers=headers,method='POST')
response = urllib.request.urlopen(req)
print(response.read().decode("utf-8"))

url = "https://www.douban.com"
headers = {"User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:47.0) Gecko/20100101 Firefox/47.0"}
req = urllib.request.Request(url=url,headers=headers)
response = urllib.request.urlopen(req)
print(response.read().decode("utf-8"))
  1. 操作数据库相关代码
# -*- codeing = uft-8 -*-
# @Time : 2021-3-24 10:06
# @Author : Lwp
# @File : testsqlite.py
# @Softwore : PyCharm

import sqlite3

comn = sqlite3.connect("test.db")   #打开或创建数据库文件
print("成功打开数据库!")
c = comn.cursor()                   #获取游标
# 1、建表
# sql='''
#     create table company
#     (id int primary key not null,
#      name text not null,
#      age int not null,
#      address char(50),
#      salary real);
# '''
# 2、插入数据

# sql = '''
#     insert into company(id,name,age,address,salary)
#        values (2,"张三",22,"万州",3899.00);
# '''

# 3、插入数据

sql = '''
select * from company
'''

cursor = c.execute(sql)              #执行sql语句
for row in cursor:
    print("id:",row[0])
    print("name:",row[1])
    print("age:",row[2])
    print("address:",row[3])
    print("salary:",row[4])
    print("\n")
    print(row)
#comn.commit()                       #提交数据库操作

comn.close()                        #关闭数据库连接
print("建表成功!")

4.保存到execl表相关代码

# -*- codeing = uft-8 -*-
# @Time : 2021-3-23 14:23
# @Author : Lwp
# @File : testxwlt.py
# @Softwore : PyCharm

import  xlwt
workbook = xlwt.Workbook(encoding="utf-8")   # 创建workbook对象
worksheet = workbook.add_sheet("sheet1")     # 创建工作表

for i in range(0,9) :
    for j in range(0,i+1) :
        worksheet.write(i,j,"%d*%d=%d"%(j+1,i+1,(i+1)*(j+1)))

workbook.save("lwp.xls")
  1. 操作bs4相关代码
# -*- codeing = uft-8 -*-
# @Time : 2021-3-22 10:37
# @Author : Lwp
# @File : testbs4.py
# @Softwore : PyCharm
'''
beautifulSoup4是将复杂html文档转化为一个复杂的树形结构,每个节点都是Python对象,所有对象可归纳成4种
- Tag 标签及其内容
- NavigableString 标签里的内容(字符串)
- BeautifulSoup 表示整个文档
- Comment 是一个特殊的NavigableString,输出内容不包含注释符号
'''

from bs4 import  BeautifulSoup
import re

file = open("./baidu.html","rb")
html = file.read().decode("utf-8")
bs = BeautifulSoup(html,"html.parser")

# print(bs.title.string)
# print(type(bs.title.string))
# print(bs.a.string)
# print(type(bs.a.string))

# 遍历find_all("A"),查找与字符串A完全匹配的字符串
# 使用正则表达式
# t_list = bs.find_all('a')
# t_list = bs.find_all(re.compile('a'))
# for item in t_list:
#     print(item)

# 定义一个函数来查找
# def name_is_exists(tag):
#     return tag.has_attr("name")
# t_list = bs.find_all(name_is_exists)
# print(t_list)

# kwars 参数
# t_list = bs.find_all('a',limit=3)
# for item in t_list:
#     print(item)

# 选择器  .表示类(class),#表示id(id)
# t_list = bs.select(".nav")
# for item in t_list:
#     print(item)
# t_list = bs.select("#logo")
# for item in t_list:
#     print(item)

# t_list = bs.select("p[class='story']") # 通过属性来查找
# for item in t_list:
#     print(item)

# t_list = bs.select("head > title") # 通过子标签来查找
# for item in t_list:
#     print(item)

t_list = bs.select(".nav") # 通过子标签来查找
for item in t_list:
    print(item.get_text)
  1. 操作正则表达式相关代码
# -*- codeing = uft-8 -*-
# @Time : 2021-3-22 15:28
# @Author : Lwp
# @File : testre.py
# @Softwore : PyCharm

# 正则表达式:字符串模式(判断字符串是否满足一定标准)
import  re
pat = re.compile("AA") # 此处AA是正则表达式,用来验证其他字符串
m = pat.search("AABC") # search字符串被校验内容
m = re.search("abc","Aabc")
print(m)

print(re.findall("a","ABaDdfAbasddsa"))
print(re.findall("[A-Z]","ABaDdfAbSSSasdDAa"))

print(re.sub("a","A","abcdaewdfgfa"))

a=r"dsfes\asdas/fds\n" # 字符串前加r表示忽略转义符
print(a)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值