第三方模块 request openpyxl

第三方模块的下载

pip工具

简介

pip 是一个现代的,通用的 Python 包管理工具。提供了对 Python 包的查找、下载、安装、卸载的功能。

注:pip 已内置于 Python 3.4 和 2.7 及以上版本,其他版本需另行安装。

pip使用注意

每个python解释器都有pip工具 如果我们的电脑上有多个版本的解释器那么我们在使用pip的时候一定要注意到底用的是哪一个 否则极其任意出现使用的是A版本解释器然后用B版本的pip下载模块。

pip位置和环境变量设置

pip工具在python/Scripts目录下:
image
Scripts目录下存在pip文件:
image
如果想在命令行窗口下使用pip,需要将这个目录添加到系统的环境变量中。
image
python多版本添加pip路径:
image

为了避免pip冲突 我们在使用的时候可以添加对应的版本号:
       python27		pip2.7
       python36		pip3.6
       python38		pip3.8

在命令行查看pip版本:
image

pip安装第三方模块

下载第三方模块的句式:
        	 pip install 模块名
       下载第三方模块临时切换仓库
    		 pip install 模块名 -i 仓库地址
       下载第三方模块指定版本(不指定默认是最新版)
    		 pip install 模块名==版本号 -i 仓库地址

下载模块:
image
指定仓库:(清华大学镜像仓库)
image
指定版本号:(默认是装最新版本 我们指定版本号3.0.5)
image

使用pip下载可能会遇到的问题

下载第三方模块可能会出现的问题
	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/
		阿里云:https://mirrors.aliyun.com/pypi/simple/
		中国科学技术大学 :https://pypi.mirrors.ustc.edu.cn/simple/
		华中科技大学:https://pypi.hustunique.com/
		豆瓣源:https://pypi.douban.com/simple/
		腾讯源:https://mirrors.cloud.tencent.com/pypi/simple
		华为镜像源:https://repo.huaweicloud.com/repository/pypi/simple/

pip换源

临时换源:

#清华源
pip install markdown -i https://pypi.tuna.tsinghua.edu.cn/simple
# 阿里源
pip install markdown -i https://mirrors.aliyun.com/pypi/simple/
# 腾讯源
pip install markdown -i http://mirrors.cloud.tencent.com/pypi/simple
# 豆瓣源
pip install markdown -i http://pypi.douban.com/simple/

永久换源:

# 清华源
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
# 阿里源
pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/
# 腾讯源
pip config set global.index-url http://mirrors.cloud.tencent.com/pypi/simple
# 豆瓣源
pip config set global.index-url http://pypi.douban.com/simple/# 换回默认源pip config unset global.index-url

出处:https://www.cnblogs.com/137point5/p/15000954.html

pycharm的第三方模块下载功能

pycharm提供更方便、更直观的下载第三方模块的方式,并且不需要输入命令。
打开settings:
image
点击加号:
image
下载第三方模块:
image
镜像仓库设置:
image

request模块

request基本使用

import requests

url = 'https://www.baidu.com'
headers = {
    'User-Agent': ''
}
r = requests.get(url=url,headers=headers)
print(type(r))  # <class 'requests.models.Response'>
r.encoding = 'utf8'  # 指定编码
print(type(r.text),type(r.content)) # content是转换为二进制码 注意text、content都是request包内的方法
print(type(r.status_code),r.status_code) # 状态码
print(type(r.cookies),r.cookies) # 获取cookies
print(type(r.history),r.history) # 请求历史

请求超时 timeout

time = requests.get('www.baidu.com',timeout=1) # 1秒内不响应 就抛出异常
time2 = requests.get('www.baidu.com',timeout=(5,30)) # 请求的两个阶段 连接和读取 我们分别设置这两个阶段的timeout 超过就报错

忽略ssl证书 verify=False

# 忽略ssl证书 SSLerror
responed = requests.get('www.xxx.com',verify=False) # 参数verify控制不验证 HTTPS HTTP

Session维持

# Session维持 模拟同一个会话 不用担心cookies
s = requests.Session()  # 创建session对象
s.get('www.xxx.com', cookies='')  # 设置好cookies
r = s.get('www.xxx.com/xxx.html')  # 再次使用get时,这个cookies状态依旧保持

办公自动化 openpyxl模块

操作excel前言

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

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

create_sheet 创建工作簿

from openpyxl import Workbook

wb = Workbook()
print(wb)  # 创建一个workbook对象 # <openpyxl.workbook.workbook.Workbook object at 0x000002BB500B7A30>
# 创建工作簿对象 worksheet
wb1 = wb.create_sheet('学生名单')
wb2 = wb.create_sheet('舔狗名单')
wb3 = wb.create_sheet('海王名单')
print(wb1) # <Worksheet "学生名单">
# 修改默认的工作簿位置
wb4 = wb.create_sheet('富婆名单', 0)  # 将其修改为第一个工作簿
# 还可以二次修改工作簿名称
wb4.title = '高富帅名单'
# 修改工作簿的颜色
wb4.sheet_properties.tabColor = "1072BA"
# 保存该excel文件
wb.save(r'black.xlsx')

写入数据的三种方法

# 填写数据的方式1
    wb4['F4'] = 666  # 将F4单元格写入666
# 填写数据的方式2
    wb4.cell(row=3, column=1, value='miku')  # row行 column列

工作簿的append方法(重要)

# 填写数据的方式3 (重要)
# 首先这是写入wb4 对应的工作簿内
# 一个append对应excel中的一行,会将列表元素一个一个放入这一行的单元格内。
wb4.append(['编号', '姓名', '年龄', '爱好'])  # 表头字段
wb4.append([1, 'mike', 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','哈哈哈'])

输出结果:
image

链家二手房爬虫

复制指定节点的html代码

copy outerHTML:
image

import requests
import re
import time
from openpyxl import Workbook

TIME = time.strftime('%Yy_%mm_%dd_%H%p_%Mm_%Ss')  # 定义时间
KEY_WORD = '浦东新区'  # 搜索关键字
PAGE_NUM = 10  # 定义一共爬多少页 上限100页
URL_TITLE = 'sh'  # sh表示上海
HOUSE_SELECT = 'ershoufang'  # 表示二手房
house_massage_big_list = []  # 最大的列表 所有的数据都会放入这个列表

if PAGE_NUM > 101:
    raise Exception('数字过大 =。=')

# 1.创建100个url
for page in range(1, PAGE_NUM + 1):
    url = f'https://{URL_TITLE}.lianjia.com/{HOUSE_SELECT}/pg{page}rs{KEY_WORD}/'
    print(url)

    try:
        res = requests.get(url=url)
    except requests.exceptions.ConnectionError:
        raise requests.exceptions.ConnectionError('网络抽风了 =。=')
    except Exception as massage:
        print(massage, '未知异常')
    else:
        print()
        print(f'网络状态码:{res.status_code}')
        time.sleep(1)

        text = res.text
        # 2.获取各种信息 放入不同的列表 一个列表30个数据 也就是一页30个数据
        title_list = re.findall('<a class="" href=".*?" target="_blank"'
                                ' data-log_index=".*?"  data-el=".*?" data-housecode=".*?" data-is_focus="" '
                                'data-sl="">(?P<title>.*?)</a>', text, re.S)  # 修饰符匹配空白字符

        house_url_list = re.findall('<a class="" href="(.*?)" target="_blank"'
                                    ' data-log_index=".*?"  data-el=".*?" data-housecode=".*?" data-is_focus="" '
                                    'data-sl="">.*?</a>', text, re.S)

        site_list = re.findall(
            '<div class="positionInfo"><span class="positionIcon"></span><a href=".*?" target=".*?" d'
            'ata-log_index=".*?" data-el="region">(.*?)</a>   -  <a href=".*?" target="_blank">(.*?)<'
            '/a> </div>', text, re.S)

        house_massage_list = re.findall('<div class="houseInfo"><span class="houseIcon"></span>(.*?)</div>', text, re.S)

        house_price_list = re.findall(
            '<div class="totalPrice totalPrice2"><i> </i><span class="">(.*?)</span><i>.*?</i></div>'
            , text, re.S)

        house_m2_price_list = re.findall(
            '<div class="unitPrice" data-hid=".*?" data-rid=".*?" data-price=".*?"><span>(.*?)</spa'
            'n></div>', text, re.S)
        people_star_list = re.findall('<div class="followInfo"><span class="starIcon"></span>(.*?)</div>', text, re.S)

        # 3. 处理一下存放位置数据的列表 (龙柏二村, 龙柏) ————> 龙柏 龙柏二村
        new_site_list = []
        for house_site in site_list:
            house, location = house_site
            new_site = f'{location} {house}'
            new_site_list.append(new_site)
        site_list = new_site_list

        # print(len(title_list))  # 标题
        # print(len(house_url_list))  # url
        # print(len(site_list))  # 位置
        # print(len(house_massage_list))  # 信息
        # print(len(house_price_list))  # 总价
        # print(len(house_m2_price_list))  # m2单价
        # print(len(people_star_list))  # 关注

        # 4.放入小列表
        one_house_all_massage = list(
            zip(title_list, house_url_list, site_list, house_massage_list, house_price_list, house_m2_price_list,
                people_star_list))
        print(f'数据量:{len(one_house_all_massage)}', '小列表')  # 查看长度
        print(one_house_all_massage)

        # 5.放入大列表
        house_massage_big_list.extend(one_house_all_massage)
        print(f'数据量:{len(house_massage_big_list)}', '大列表')
        print(house_massage_big_list)


# 保存数据到excel
excel_obj = Workbook()  # 创建excel文件
# 1.创建工作簿
wb = excel_obj.create_sheet(f'{KEY_WORD}', 0)
# 2.添加表头
wb.append(['标题', 'url链接', '位置', '信息', '总价/万', '每平米的价格/元', '热度'])
# 3.将每个数据存入excel
for i in house_massage_big_list:
    wb.append(i)
# 4.保存excel
excel_obj.save(f'{KEY_WORD}_{TIME}.xlsx')
posted @ 2022-10-26 21:53  passion2021  阅读(73)  评论(0编辑  收藏  举报