Python爬虫学习笔记
一、Python的基本知识
Python环境安装
- 打开主页https://www.python.org/,下载Python3.8。
- 打开https://www.jetbrains.com/pycharm/,下载pychar。
- 安装配置开发环境Python3.8时,选择定制安装,并将Add Python3.8 To Path选中。
- 安装pychar时,选中Add Python to environment variables。
- 设置环境变量path和python,path变量增加两个目录,一个为Python.exe所在目录,一个为该目录下的Scripts目录。
- pychar设置,File–>settings–>editor–>File and Code Templates–>Python File增加下列内容
#-*- codeing = uft-8 -*-
#@Time : ${DATE} ${TIME}
#@Author : Lwp
#@File : ${NAME}.py
#@Softwore : ${PRODUCT_NAME}
判断语句和循环语句
- 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
- break中断整个循环、continue跳出当前循环、pass空语句,站位
字符串
- 反斜杠\转义符的应用: \\ 代表反斜杠 \ '代表单引号 \" 代表双引号
- r"ni hao \n chongqing",字符串前面加r表示字符串内容原封不动保留,不会再转义。
- 字符串乘法的应用 如:打印结果为”lwplwplwp“
print("lwp"*3)
- 字符串常见操作
capitalize()、encode(encoding=“utf-8”,errors=‘strict’)、count()、isalnum()、isdigit()、join()、lstrip()、rstrip()、split()等
常用数据结构:列表、元组、集合、字典
- 列表
列表可以完成大多数集合类的数据结构,列表可以嵌套;
列表索引值以0开始,-1为末尾开始;
列表的增加成员操作:append、extend、insert
列表的删除操作:del、remove、pop
列表的修改操作:通过列表下标修改,如:list[8]=9,将列表下标为8的成员内容改为9
列表的查询操作:in,not in
列表的排序操作:sort、reverse - 元组
元组特点:元素不能修改、可以包括可变对象如列表(‘a’,‘b’,[‘aa’,‘bb’])
元组的常见操作:通过下标访问,通过for循环遍历,使用[::]tuple1=[5:3:2]切片,+、in、count、len、max、min、tuple等操作 - 字典
字典特点:无序、键值对(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)
- 集合
集合特点:与字典类似、只是键(key)的组合,无值(value),不能重复,无序
集合常见操作:for遍历、update、add、remove、pop、clear、del
函数、文件操作、 异常处理
- 函数的格式、分类、调用,变量的作用域局部变量和全局变量。
- 文件的相关知识:文件的打开(open)模式r、w、a、rb、wb、ab、r+、w+,文件的关闭(close),文件的读取read、readline、readlines,通过引入os(import os)可以进行文件的重命名rename、文件的删除remove、创建文件夹mkdir、获取当前目录getcwd等。
- 异常处理相关知识:
语法:try : except 错误类型 : 执行语句 finally : 语句。
finally 代码无论是否发生错误,均会执行;exception as result可以承接任何错误;异常处理可以嵌套。
二、爬虫的技术实现
urlib库的使用
- 引入系统模块:import os import sys 。
- 引入自定义包:from test1 import l1,自己开发一个test1的包(目录)包含l1.py的一个文件,将其引入到当前程序中,以便调用l1.py中的函数或方法。
- 引入第三方模块:
在命令行运行Python,再输入pip bs4,可以下载并安装bs4库;
通过pychar安装第三方报:file–>setting–>project 具体项目–>Python interpreter,点击左下角的”+“来添加第三方包。 - httpbin.org,测试http和https
- 获取一个get请求
import urllib.request
respone=urllib.request.urlopen("http://httpbin.org/get")
print(respone.read().decode("utf-8"))
- 获取一个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代表不影响爬虫工具访问
- 测试伪装浏览器访问
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"))
- 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)
正则表达式
- 常见语法
^ 表示匹配字符串的开始位置 (例外 用在中括号中[ ] 时,可以理解为取反,表示不匹配括号中字符串)
$ 表示匹配字符串的结束位置 * 表示匹配 零次到多次 + 表示匹配 一次到多次 (至少有一次)
? 表示匹配零次或一次
. 表示匹配单个字符
| 表示为或者,两项中取一项
( ) 小括号表示匹配括号中全部字符
[ ] 中括号表示匹配括号中一个字符 范围描述 如[0-9 a-z A-Z]
{ } 大括号用于限定匹配次数 如 {n}表示匹配n个字符 {n,}表示至少匹配n个字符 {n,m}表示至少n,最多m
\ 转义字符 如上基本符号匹配都需要转义字符 如 * 表示匹配*号
\w 表示英文字母和数字 \W 非字母和数字
\d 表示数字 \D 非数 - 常用函数
search(),match(),findall(),split(),sub() - 常识
re.l 忽略大小写,re.S使.匹配包括换行符在内的所有字符,a=r"dsfes\a.sdas/fds\n" # 字符串前加r表示忽略转义符
xlwt对Excel的操作
- 导入包:import xlwt
- 创建workbook对象:book = xlwt.Workbook(encoding=“utf-8”,style_compression=0)
- 创建工作表:sheet = book.add_sheet(“豆瓣电影top250”,cell_overwrite_ok=True)
- 向工作表中写数据:sheet.write(i1+1, j, data[j])
- 保存到文件中:book.save(savepath)
SQlite数据库
- 引入报:import sqlite3
- 打开或创建数据库文件:comn = sqlite3.connect(“test.db”)
- 获取游标:c = comn.cursor()
- 执行sql语句:c.execute(sql)
- 提交数据库操作:comn.commit()
- 关闭数据库连接:comn.close()
三、数据可视化的技术应用
Flask框架入门
- Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收http请求并对请求进行预处理,然后触发Flask框架,开发人员基于Flask框架提供的功能对请求进行相应的处理,并返回给用户,如果要返回给用户复杂的内容时,需要借助jinja2模板来实现对模板的处理,即:将模板和数据进行渲染,将渲染后的字符串返回给用户浏览器。
- 其 WSGI 工具箱采用 Werkzeug(路由模块),模板引擎则使用 Jinja2。这两个也是 Flask 框架的核心。
- 默认情况下,Flask 不包含数据库抽象层、表单验证,或是其它任何已有多种库可以胜任的功能。然而,Flask 支持用扩展来给应用添加这些功能,如同是 Flask 本身实现的一样。众多的扩展提供了数据库集成、表单验证、上传处理、各种各样的开放认证技术等功能。Flask 也许是“微小”的,但它已准备好在需求繁杂的生产环境中投入使用。
- 基本路由系统
•@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’]) - 路由解析:通过用户访问的路径,匹配相应的函数,路由路径不能重复,用户通过唯一路径访问特定函数,参数类型不一样,则也认为是不重复的。
- 打开debug模式:点击右上角Flask(app.py)下箭头,选择Edit Configurations,勾选FLASK_DEBUG,重启服务。
- render_template渲染,向HTML文件传递参数,{%%}控制结构如for循环、if语句等,{{}}使用传递来的变量,字典中的键值对,需要用迭代items()函数。
- 表单提交:name为key,输入的值为value;url_for(‘result’)反向解析URL地址。
- 一段简单代码:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello World!'
if __name__ == '__main__':
app.run()
Echarts的应用
- 基本语法
第一步:创建 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’:自定义系列
- 完整实例代码
<!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的应用
-
简介
wordcloud库,可以说是python非常优秀的词云展示第三方库。词云以词语为基本单位更加直观和艺术的展示文本。
wordcloud做词频统计分为以下几个步骤:
(1)、分隔:以空格分隔单词
(2)、统计 :单词出现的次数并过滤
(3)、字体:根据统计搭配相应的字号
(4) 、布局 -
参数含义:
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) #输出到文件 -
简单代码
#!/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')
学习中用到的代码
- 完整获取豆瓣网络信息的代码
# -*- 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()
- 伪装浏览器方式爬取网页
# -*- 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"))
- 操作数据库相关代码
# -*- 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")
- 操作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)
- 操作正则表达式相关代码
# -*- 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)