常用模块:第三方模块的下载与使用、requests模块、爬取链家二手房数据、openpyxl模块、hashlib加密模块
一、第三方模块的下载与使用
第三方模块就是我们直接说的大佬的模块,这也是python目前这么流行的原因。通常来说如果我们想使用第三方模块需要先下载,之后再次使用的时候就相当于导入内置模块一样直接导入就可以使用了。
下载第三方模块的方式一:pip工具
1、使用win+R打开cmd窗口(命令提示符窗口)
2、输入pip install 模块名称 -i 仓库地址
下载第三方模块的句式
pip install 模块名
下载第三方模块临时切换仓库
pip install 模块名 -i 仓库地址
下载第三方模块指定版本(不指定默认是最新版)
pip install 模块名==版本号 -i 仓库地址
注:
1.pip的文件在python解释器的scrips文件夹中,我们需要注意不能直接用pip命名,要在后面接上版本号,如果没有对应的文件,就跟之前创建python解释器多版本共存一样,复制pip文件,重命名成对应的pip+python解释器版本名称。
2.当我们第一次使用pip的时候会出现很多奇奇怪怪的问题,这时候我们需要看返回给我们的错误信息或提示,当这些信息中有放在引号中的指令的时候我们可以根据提示判断指令的作用(基本都是帮我们解决问题的),如果没有看得明白的信息就复制到百度搜索对应的解决策略。
3.下载出现timeout(超时)
这类情况可能是自己当前的网络环境不好。
4.下载速度慢
pip的默认下载地址都是国外的,我们只需要切换下载地址即可
关于切换下载地址的方式在上面已经说明(仓库地址可以参考下面的常用仓库地址)
部分错误解决案例:
这里是我装的时候遇到的一些问题。第一次使用国内仓库地址会出现不被信任的提示错误提示中会出现带引号的命令提示,我们在原本的命令之后接空格然后ctrl+v直接粘贴上去就可以接着安装了。也可以根据提示把仓库地址中的http改成https。
下载第三方模块的方式二:pycharm中下载
步骤一:
在pycharm中创建一个项目后点击file,选择setttings,接着在弹出的窗口中选择左边列表中的project:+项目名称,然后选择python Interperter,第一次打开这个界面的时候内容很少,当我们导入了很多的模块之后会一一在下面显示出来。
步骤二:
在右边显示模块的地方双击,会弹出模块的安装界面,搜索需要安装的模块,然后点击左下方的Install Package就是安装模块。Install Package右边的ManageRepositories就是设置下载的仓库地址,可以有多个也可以只留一个国内的地址。
注:这里需要注意,如果我们遇到错误同上面说的仓库地址未信任的情况,需要使用更改仓库地址中的http变成https,不能使用上面的代码临时允许安装了。
pip仓库地址
由于默认的pip仓库地址在国外,因此导致下载速度很慢,所以这时候就可以使用国内的pip仓库地址来下载第三方模块
常用pip仓库地址
清华大学 :https://pypi.tuna.tsinghua.edu.cn/simple/
阿里云:http://mirrors.aliyun.com/pypi/simple/
中国科学技术大学 :http://pypi.mirrors.ustc.edu.cn/simple/
华中科技大学:http://pypi.hustunique.com/
豆瓣源:http://pypi.douban.com/simple/
腾讯源:http://mirrors.cloud.tencent.com/pypi/simple
华为镜像源:https://repo.huaweicloud.com/repository/pypi/simple/
二、网络爬虫模块之requests模块
requests模块用于模拟浏览器想网页发送网络请求
# 1.朝指定网址发送请求获取页面数据(等价于:浏览器地址栏输入网址回车访问)
res = requests.get('http://www.redbull.com.cn/about/branch')
print(res.content) # 获取bytes类型的网页数据(二进制)
res.encoding = 'utf8' # 指定编码
print(res.text) # 获取字符串类型的网页数据(默认按照utf8)
方法介绍:
1、get()
模拟浏览器想网页地址发送请求
# 写法一:
response = requests.get("http://www.baidu.com/")
# 写法二:
# response = requests.request("get", "http://www.baidu.com/")
2、添加headers和查询参数
如果想添加 headers,可以传入headers参数来增加请求头中的headers信息。如果要将参数放在url中传递,可以利用 params 参数。
import requests
kw = {'wd':'长城'}
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"}
# params 接收一个字典或者字符串的查询参数,字典类型自动转换为url编码,不需要urlencode()
response = requests.get("http://www.baidu.com/s?", params = kw, headers = headers)
3、text
#查看响应内容,response.text 返回的是Unicode格式的数据
print response.text
#<!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8><meta http-equiv=X-UA-Compatible content=IE=Edge><meta content=always name=referrer> .....
4、content
# 查看响应内容,response.content返回的字节流数据
print respones.content
5、url
# 查看完整url地址
print response.url
# http://www.baidu.com/?wd=%E9%95%BF%E5%9F%8E
6、encoding
# 查看响应头部字符编码
print response.encoding
# ISO-8859-1
7、status_code
# 查看响应码
print response.status_code
# 200
8、timeout
请求超时
time = requests.get('www.baidu.com',timeout=1) # 1秒内不响应 就抛出异常
time2 = requests.get('www.baidu.com',timeout=(5,30)) # 请求的两个阶段 连接和读取 我们分别设置这两个阶段的timeout 超过就报错
9、verify=False
忽略ssl证书
# 忽略ssl证书 SSLerror
responed = requests.get('www.xxx.com',verify=False) # 参数verify控制不验证 HTTPS HTTP
10、Session维持
# Session维持 模拟同一个会话 不用担心cookies
s = requests.Session() # 创建session对象
s.get('www.xxx.com', cookies='') # 设置好cookies
r = s.get('www.xxx.com/xxx.html') # 再次使用get时,这个cookies状态依旧保持
三、网络爬虫实战之爬取链家二手房数据
import requests
import re
res = requests.get('https://sh.lianjia.com/ershoufang/pudong/')
# print(res.text)
data = res.text
home_title_list = re.findall(
'<a class="" href=".*?" target="_blank" data-log_index=".*?" data-el="ershoufang" data-housecode=".*?" data-is_focus="" data-sl="">(.*?)</a>',
data)
# print(home_title_list)
home_name_list = re.findall('<a href=".*?" target="_blank" data-log_index=".*?" data-el="region">(.*?) </a>', data)
# print(home_name_list)
home_street_list = re.findall(
'<div class="positionInfo"><span class="positionIcon"></span><a href=".*?" target="_blank" data-log_index=".*?" data-el="region">.*? </a> - <a href=".*?" target="_blank">(.*?)</a> </div>',
data)
# print(home_street_list)
home_info_list = re.findall('<div class="houseInfo"><span class="houseIcon"></span>(.*?)</div>', data)
# print(home_info_list)
home_watch_list = re.findall('<div class="followInfo"><span class="starIcon"></span>(.*?)</div>', data)
# print(home_watch_list)
home_total_price_list = re.findall(
'<div class="totalPrice totalPrice2"><i> </i><span class="">(.*?)</span><i>万</i></div>', data)
# print(home_total_price_list)
home_unit_price_list = re.findall(
'<div class="unitPrice" data-hid=".*?" data-rid=".*?" data-price=".*?"><span>(.*?)</span></div>', data)
# print(home_unit_price_list)
home_data = zip(home_title_list, home_name_list, home_street_list, home_info_list, home_watch_list,
home_total_price_list, home_unit_price_list)
with open(r'home_data.txt','w',encoding='utf8') as f:
for data in home_data:
print(
"""
房屋标题:%s
小区名称:%s
街道名称:%s
详细信息:%s
关注程度:%s
房屋总价:%s
房屋单价:%s
"""%data
)
f.write("""
房屋标题:%s
小区名称:%s
街道名称:%s
详细信息:%s
关注程度:%s
房屋总价:%s
房屋单价:%s\n
"""%data)
这里的思路是,先分开获取想要查找的每个信息,然后用zip方法拼接输出,同时分开依次存到文件中
四、自动化办公领域之openpyxl模块
1.excel文件的后缀名问题
03版本之前
.xls
03版本之后
.xlsx
2.操作excel表格的第三方模块
xlwt往表格中写入数据、wlrd从表格中读取数据
兼容所有版本的excel文件
openpyxl最近几年比较火热的操作excel表格的模块
03版本之前的兼容性较差
ps:还有很多操作excel表格的模块 甚至涵盖了上述的模块>>>:pandas
3.openpyxl操作
在学习这方面知识之前,我们需要了解到,应当强化自己的网上学习能力,比如openpyxl模块就可以在网上查看说明来了解相关功能(页面是纯英文可以翻译页面也可以在网上找别人写的博客)
功能介绍
创建一个excel文件
from openpyxl import Workbook
# 实例化
wb = Workbook()
# 激活 worksheet
ws = wb.active
打开一个excel文件
from openpyxl import load_workbook
wb2 = load_workbook('文件名称.xlsx')
存储数据
1、append
这是一行一行加入数据功能,也可以一次加入多行
# 可以附加行,从第一列开始附加(从最下方空白处,最左开始)(可以输入多行)
ws.append([1, 2, 3])
2、['单元格位置'] = 内容
ws['A1'] = 42
3、Python 类型会被自动转换
ws['A3'] = datetime.datetime.now().strftime("%Y-%m-%d")
创建表
# 方式一:插入到最后(default)
>>> ws1 = wb.create_sheet("Mysheet")
# 方式二:插入到最开始的位置
>>> ws2 = wb.create_sheet("Mysheet", 0)
选择表
# sheet 名称可以作为 key 进行索引
>>> ws3 = wb["New Title"]
>>> ws4 = wb.get_sheet_by_name("New Title")
>>> ws is ws3 is ws4
True
查看表名
# 显示所有表名
>>> print(wb.sheetnames)
['Sheet2', 'New Title', 'Sheet1']
# 遍历所有表
>>> for sheet in wb:
... print(sheet.title)
修改工作簿名称
title
可以更改工作簿名称
通过待修改名称工作簿‘点’的方式在后方赋予新的名称
导入模块:
form openpyxl import workbook
代码用法:
from openpyxl import Workbook
wb = Workbook()
ws1 = wb.cerate_sheet('用户信息表', 0)
ws1.title = 'user_infor'
修改工作簿颜色
sheet_properties.tabColor
用来给工作簿背景修改颜色,需要用到RGB色域
导入模块:
from openpyxl import Workbook
wb = Workbook()
ws1 = wb.create_sheet('用户信息表', 0)
ws1.sheet_properties.tabColor = 'FF6666'
# 将标题背景改为指定RRGGBB颜色代码
访问单元格
cell( )
可以通过工作簿'点'的方式,在后方参数内填写内容的位置,来修改内容
row:行
colum:列
value:值(对应位置的数据
# 方法一
>>> c = ws['A4']
# 方法二:row 行;column 列
>>> d = ws.cell(row=4, column=2, value=10)
# 方法三:只要访问就创建
>>> for i in range(1,101):
... for j in range(1,101):
... ws.cell(row=i, column=j)
保存文件
save( )
在关键词后方参数内填入文件保存的地址,同时赋予文件名
wb = Workbook()
wb.save('user_infor.xlsx')
# balances.xlsx 是保存的路径,也就是文件名。
# 编辑完要保存才行。
多单元格访问
# 通过切片
>>> cell_range = ws['A1':'C2']
# 通过行(列)
>>> colC = ws['C']
>>> col_range = ws['C:D']
>>> row10 = ws[10]
>>> row_range = ws[5:10]
# 通过指定范围(行 → 行)
>>> for row in ws.iter_rows(min_row=1, max_col=3, max_row=2):
... for cell in row:
... print(cell)
<Cell Sheet1.A1>
<Cell Sheet1.B1>
<Cell Sheet1.C1>
<Cell Sheet1.A2>
<Cell Sheet1.B2>
<Cell Sheet1.C2>
# 通过指定范围(列 → 列)
>>> for row in ws.iter_rows(min_row=1, max_col=3, max_row=2):
... for cell in row:
... print(cell)
<Cell Sheet1.A1>
<Cell Sheet1.B1>
<Cell Sheet1.C1>
<Cell Sheet1.A2>
<Cell Sheet1.B2>
<Cell Sheet1.C2>
# 遍历所有 方法一
>>> ws = wb.active
>>> ws['C9'] = 'hello world'
>>> tuple(ws.rows)
((<Cell Sheet.A1>, <Cell Sheet.B1>, <Cell Sheet.C1>),
(<Cell Sheet.A2>, <Cell Sheet.B2>, <Cell Sheet.C2>),
...
(<Cell Sheet.A8>, <Cell Sheet.B8>, <Cell Sheet.C8>),
(<Cell Sheet.A9>, <Cell Sheet.B9>, <Cell Sheet.C9>))
# 遍历所有 方法二
>>> tuple(ws.columns)
((<Cell Sheet.A1>,
<Cell Sheet.A2>,
<Cell Sheet.A3>,
...
<Cell Sheet.B7>,
<Cell Sheet.B8>,
<Cell Sheet.B9>),
(<Cell Sheet.C1>,
...
<Cell Sheet.C8>,
<Cell Sheet.C9>))
举例
from openpyxl import Workbook
# 创建一个excel文件(实例化)
wb = Workbook()
# 在一个excel文件内创建多个工作簿
wb1 = wb.create_sheet('学生名单')
wb2 = wb.create_sheet('舔狗名单')
wb3 = wb.create_sheet('海王名单')
# 还可以修改默认的工作簿位置
wb4 = wb.create_sheet('富婆名单', 0)
# 还可以二次修改工作簿名称
wb4.title = '高富帅名单'
wb4.sheet_properties.tabColor = "1072BA"
# 填写数据的方式1
# wb4['F4'] = 666
# 填写数据的方式2
# wb4.cell(row=3, column=1, value='jason')
# 填写数据的方式3
wb4.append(['编号', '姓名', '年龄', '爱好']) # 表头字段
wb4.append([1, 'jason', 18, 'read'])
wb4.append([2, 'kevin', 28, 'music'])
wb4.append([3, 'tony', 58, 'play'])
wb4.append([4, 'oscar', 38, 'ball'])
wb4.append([5, 'jerry', 'ball'])
wb4.append([6, 'tom', 88,'ball','哈哈哈'])
# 填写数学公式
# wb4.cell(row=1, column=1, value=12321)
# wb4.cell(row=2, column=1, value=3424)
# wb4.cell(row=3, column=1, value=23423432)
# wb4.cell(row=4, column=1, value=2332)
# wb4['A5'] = '=sum(A1:A4)'
# wb4.cell(row=8, column=3, value='=sum(A1:A4)')
# 保存该excel文件
wb.save(r'111.xlsx')
"""
openpyxl主要用于数据的写入 至于后续的表单操作它并不是很擅长 如果想做需要更高级的模块pandas
import pandas
data_dict = {
"公司名称": comp_title_list,
"公司地址": comp_address_list,
"公司邮编": comp_email_list,
"公司电话": comp_phone_list
}
# 将字典转换成pandas里面的DataFrame数据结构
df = pandas.DataFrame(data_dict)
# 直接保存成excel文件
df.to_excel(r'pd_comp_info.xlsx')
excel软件正常可以打开操作的数据集在10万左右 一旦数据集过大 软件操作几乎无效
需要使用代码操作>>>:pandas模块
"""
五、作业
1.思考如何爬取二手房指定页数的数据
import requests
import re
url_l = 'https://sh.lianjia.com/ershoufang/pudong/pg%s/'
for i in range(1,101):
url_now = url_l % i
res = requests.get(url_now)
# print(res.text)
data = res.text
home_title_list = re.findall(
'<a class="" href=".*?" target="_blank" data-log_index=".*?" data-el="ershoufang" data-housecode=".*?" data-is_focus="" data-sl="">(.*?)</a>',
data)
# print(home_title_list)
home_name_list = re.findall('<a href=".*?" target="_blank" data-log_index=".*?" data-el="region">(.*?) </a>', data)
# print(home_name_list)
home_street_list = re.findall(
'<div class="positionInfo"><span class="positionIcon"></span><a href=".*?" target="_blank" data-log_index=".*?" data-el="region">.*? </a> - <a href=".*?" target="_blank">(.*?)</a> </div>',
data)
# print(home_street_list)
home_info_list = re.findall('<div class="houseInfo"><span class="houseIcon"></span>(.*?)</div>', data)
# print(home_info_list)
home_watch_list = re.findall('<div class="followInfo"><span class="starIcon"></span>(.*?)</div>', data)
# print(home_watch_list)
home_total_price_list = re.findall(
'<div class="totalPrice totalPrice2"><i> </i><span class="">(.*?)</span><i>万</i></div>', data)
# print(home_total_price_list)
home_unit_price_list = re.findall(
'<div class="unitPrice" data-hid=".*?" data-rid=".*?" data-price=".*?"><span>(.*?)</span></div>', data)
# print(home_unit_price_list)
home_data = zip(home_title_list, home_name_list, home_street_list, home_info_list, home_watch_list,
home_total_price_list, home_unit_price_list)
with open(r'home_data.txt','a',encoding='utf8') as f:
for data in home_data:
print(
"""
房屋标题:%s
小区名称:%s
街道名称:%s
详细信息:%s
关注程度:%s
房屋总价:%s
房屋单价:%s
"""%data
)
f.write("""
房屋标题:%s
小区名称:%s
街道名称:%s
详细信息:%s
关注程度:%s
房屋总价:%s
房屋单价:%s\n
"""%data)