第三方模块下载与使用,爬虫requests模块,自动化办公领域openpyxl模块,pandas初见

昨日内容回顾

  • 正则表达式前戏
正则表达式是一门独立的语言

主要的功能在于使用特殊符号的组合或者直接填写需要查找的具体内容去字符串中筛选出符合条件的数据
  • 正则表达式之字符组
中括号括起来 里面填写一些内容
[0123456789]
[0-9]
[a-z]
[A-Z]
[0-9a-zA-Z]
"""
字符组默认情况下筛选数据是挨个挨个匹配 字符串内所有的内容默认都是或关系
"""
  • 正则表达式之特殊符号
.		匹配除换行符以外的任意字符
\w		匹配数字,字母,下划线
\W		匹配除数字字母下划线
\d		匹配数字
^ 		匹配字符串的开头
$		匹配字符串的结尾
()		正则表达式分组
[^]		中括号内取反操作查找除括号内其他字符
a|b		匹配a或者b
"""特殊符号默认情况下筛选数据也是挨个挨个匹配"""
  • 正则表达式之量词
*		零次或多次(默认无穷次
+		一次或多次(默认无穷次
?		零次或一次(主要用于非贪婪匹配
{n}		n次
{n,}	n次或多次(默认无穷次
{n,m}	n到m次(默认m次
"""量词默认情况下都是贪婪匹配>>>:尽可能多的匹配"""
  • 正则表达式之贪婪与非贪婪匹配
量词后面如果跟了问号则会变成非贪婪匹配
.*
.*?
"""
使用贪婪匹配或者非贪婪匹配 建议在前后加上明确的结束标志
"""
  • 正则表达式之转义符
在正则表达式中也存在斜杠与字母的组合会产生特殊含义 如果想避免该现象需要再加一个斜杠取消前面斜杠的含义
\\n		\n
\\\n	\\n
在python中转义可以使用字母r
  • 正则表达式之实战建议
常见的正则直接百度搜索 不要自己写浪费时间
  • re模块常见用法
import re
re.findall(正则表达式,待匹配的内容)找到所有符合正则表达式的内容,返回列表
re.finditer(正则表达式,待匹配的内容)找到所有符合正则表达式的内容,返回迭代器
re.search(正则表达式,待匹配的内容)找到一个符合正则表达式的内容就结束
re.match(正则表达式,待匹配的内容)找开头与正则表达式是否一样,一样则返回,不再往后找,如果开头不一样则返回none
obj = re.compile(正则表达式)可以弄好以后使用
re.split()  # 切割
re.sub()  # 替换
re.subn()  # 替换
  • re模块补充说明
1.分组优先展示
	findall()  # 默认分组优先
    findall((?:\d))  # 取消分组优先
2.分组起别名
	(?P<user_id>\d)
    res = re.search()
    res.group(0)
    res.group('user_id')

第三方模块下载与使用,爬虫requests模块,自动化办公领域openpyxl模块,pandas初见

今日内容概要

  • 第三方模块的下载和使用
  • 网络爬虫模块之requests模块
  • 网络爬虫实战之爬取链家二手房数据
  • 自动化办公领域之openpyxl模块
  • 第三方模块的扩展(模块叠模块)
  • hashlib加密模块

今日内容详细

第三方模块的下载与使用

第三方模块:别人写的模块 一般情况下功能都特别强大

我们如果想使用第三方模块 第一次必须先下载后面才可以反复使用(等同于内置模块)

第三方下载模块的方式
1.pip工具
	注意每个解释器都有pip工具 如果我们的电脑上有多个版本的解释器那么我们在使用pip的时候一定要注意到底用的是哪一个 否则极其容易出现使用的是A版本解释器然后用B版本的pip下载模块
    为了避免pip冲突 我们在使用的时候可以 添加对应的版本号
    python27		pip2.7
    python36		pip3.6
    python38		pip3.8
2.下载第三方模块的句式
	pip install 模块名
    下载第三方模块临时切换仓库
    	pip install 模块名 -i 仓库地址
    下载第三方模块指定版本(不知道默认是最新版)
    	pip install 模块名==版本号 -i 仓库地址
3.pycharm提供快捷方式

1.打开软件pycharm,点击左上角file,打开其中的settings

2.在调出的界面中,选择左侧project中的project interpreter。

3.选择你要添加模块的解释器

4.双击一个模块进入模块查找

5.搜索第三方模块,选择版本,然后安装

下载第三方模块可能会出现的问题
1.报错并有警告信息
	WARNING: You are using pip version 20.2.1;
    原因在于pip版本过低 只需要拷贝后面的命令执行更新操作即可
    d:\python38\python.exe -m pip install --upgrade pip
    更新完成后再次执行下载第三方模块的命令即可
2.报错并含有Timeout关键字
	说明当前计算机网络不稳定 只需要换网或者重新执行几次即可
3.报错并没有关键字
	面向百度搜索
    	pip下载xxx报错:拷贝错误信息
    通常都是需要用户提前准备好一些环境才可以顺利下载
4.下载速度很慢
	pip默认下载的仓库地址是国外的 python.org
    我们可以切换下载的地址
    pip install 模块名 -i 仓库地址
    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/

改变下载的地址

1.还在之前那个页面,切换下载地址

2.点击加号并填入下载地址

网络爬虫模块之requests模块

requests模块能够模拟浏览器发送网络请求

import requests

# 1.朝指定网址发送请求获取页面数据(等价于:浏览器地址栏输入网址回车访问)
res = requests.get('http://www.redbull.com.cn/about/branch')
# print(res.content)  # 获取bytes类型的网页数据(二进制)
res.encoding = 'utf8'  # 指定编码
print(res.text)

网络爬虫实战之爬取链家二手房数据

import requests
import re

# # 1.朝指定网址发送请求获取页面数据(等价于:浏览器地址栏输入网址回车访问)
# res = requests.get('http://www.redbull.com.cn/about/branch')
# # print(res.content)  # 获取bytes类型的网页数据(二进制)
# res.encoding = 'utf8'  # 指定编码
# print(res.text)


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:
        f.write('''
        房屋标题:%s
        小区名称:%s
        街道名称:%s
        详细信息:%s
        关注程度:%s
        房屋总价:%s
        房屋单价:%s\n
        '''%data)


自动化办公领域之openpyxl模块

1.excel文件的后缀名问题
	03版本之前		.xls
    03版本之后		.xlsx
    
2.操作excel表格的第三方模块
	xlwt往表格中写入数据,wlrd从表格中读取数据
    兼容所有版本的excel文件
    openpyxl最近几年比较火热的操作excel表格的模块
    03版本之前的兼容性较差
    ps:还有很多操作excel表格的模块 甚至涵盖了上述的模块>>>:pandas
    
3.openpyxl操作
'''学会看官方文档'''

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, 'play'])
wb4.append([5, 'jerry', 'play'])
wb4.append([6, 'tony', 88, 'play', '哈哈哈'])

# 填写数学公式
wb4.cell(row=12, column=1, value=12321)
wb4.cell(row=13, column=1, value=3434)
wb4.cell(row=14, column=1, value=3455)
wb4.cell(row=15, column=1, value=65647)
wb4['A16'] = '=sum(A12:A14)'
wb4.cell(row=6, column=6, value='=sum(A12:A14)')

# 保存该excel文件
wb.save(r'111.xlsx')


openpyxl主要用于数据的写入 至于后续的表单操作它并不是很擅长 如果想做需要更高级的就要使用模块pandas

import pandas
import re

with open(r'redbull.html', 'r', encoding='utf8') as f:
    data = f.read()

res = re.findall("<h2>(.*?)</h2><p class='mapIco'>(.*?)</p><p class='mailIco'>(.*?)</p><p class='telIco'>(.*?)</p></li><li", data)
# print(res)  # [(),(),(),()]

comp_title_list = re.findall("<h2>(.*?)</h2>", data)
comp_address_list = re.findall("<p class='mapIco'>(.*?)</p>", data)
comp_email_list = re.findall("<p class='mailIco'>(.*?)</p>", data)
comp_phone_list = re.findall("<p class='telIco'>(.*?)</p></li><li", data)

data_dict = {
    '公司名称': comp_title_list,
    '公司地址': comp_address_list,
    '公司邮编': comp_email_list,
    '公司电话': comp_phone_list
}
# print(data_dict)
# 将字典转换成pandas里面的DataFrame数据结构
df = pandas.DataFrame(data_dict)
# 直接保存成excel文件
df.to_excel(r'pd_comp_info.xlsx')


excel软件正常可以打开操作的数据集在10w左右 一旦数据集过大 软件操作几乎无效
需要使用代码操作>>>:pandas模块

今日作业

import requests
import re


while True:
    user_page = input('请输入你要查询的二手房页数(q/Q退出):').strip()
    if user_page.upper() == 'Q':
        break
    if not user_page.isdigit():
        print('页数必须是数字')
    if user_page == '1':
        res = requests.get('https://sh.lianjia.com/ershoufang/rs/')
        data = res.text
    else:
        user_page = int(user_page)
        res = requests.get(f'https://sh.lianjia.com/ershoufang/pg{user_page}/')
        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)

    home_name_list = re.findall('<a href=".*?" target="_blank" data-log_index=".*?" data-el="region">(.*?) </a>', data)

    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)

    home_info_list = re.findall('<div class="houseInfo"><span class="houseIcon"></span>(.*?)</div>', data)

    home_watch_list = re.findall('<div class="followInfo"><span class="starIcon"></span>(.*?)</div>', data)

    home_total_price_list = re.findall(
        '<div class="totalPrice totalPrice2"><i> </i><span class="">(.*?)</span><i>万</i></div>', data)

    home_unit_price_list = re.findall(
        '<div class="unitPrice" data-hid=".*?" data-rid=".*?" data-price=".*?"><span>(.*?)</span></div>', data)

    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)
    break
for data in home_data:
    print('''
        房屋标题:%s
        小区名称:%s
        街道名称:%s
        详细信息:%s
        关注程度:%s
        房屋总价:%s
        房屋单价:%s\n
        '''%data)

posted @ 2022-10-26 21:19  lsumin  阅读(9)  评论(0编辑  收藏  举报