ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

网络爬虫和openpyxl模块

2022-07-20 21:00:12  阅读:150  来源: 互联网

标签:run openpyxl 括号 res 爬虫 re 模块 print


re模块

re模块基础使用

  • re模块是python使用的正则表达式的方法之一

  • findall

    findall括号第一个是正则表达式,第二个是被筛选字符串,将筛选结果组成列表

import re

res = re.findall('r', 'barry run rr')  # 筛选符合正则表达式的数据
print(res)
# run:['r', 'r', 'r', 'r', 'r']
  • finditer

    finditer和findall作用一致,不过筛选出来的结果处理成迭代器对象,用于节省内存

import re

res = re.finditer('r', 'barry run rr')  # 筛选符合正则表达式的数据处理成迭代器对象
print(res)
# run:<callable_iterator object at 0x000001AC9DED8430>
print(res.__next__())
# run:<re.Match object; span=(2, 3), match='r'>
  • search

    search只有筛选到一个结果就会结束,输出以匹配到对象和所在位置,通过group就可以变回以匹配对象

import re

res = re.search('r', 'barry run rr')  # 筛选一个符合正则表达式的数据就结束
print(res)
# run:<re.Match object; span=(2, 3), match='r'>
print(res.group())
# run:r
  • match只筛选开始的第一个数据,若是匹配成功则结束,若是匹配不成功则结束并返回None
import re

res = re.match('r', 'barry run rr')  # 只筛选开始的一个数据是否符合正则表达式
print(res)
# run:None
res = re.match('r', 'rry run rr')  # 只筛选开始的一个数据是否符合正则表达式
print(res)
# run:<re.Match object; span=(0, 1), match='r'>
print(res.group())
# run:r
  • compile

    compile括号内部是准备好的正则表达式,在需要使用时直接使用正则绑定的变量名即可

import re

res = re.compile('r')  # 提前准备好正则表达式
print(re.findall(res,  'rry run rr'))
# run:['r', 'r', 'r', 'r', 'r']
print(re.findall(res, 'ekwererkrk23'))
# run:['r', 'r', 'r']

img

re模块补充

  • 在findall括号内用()将正则表达式括起来,是优先展示括号内匹配的结果的意思
res = re.findall('a(b)cd', 'abcdabcdabcd')  #  findall优先展示括号内匹配的结果
print(res)
# run:['b', 'b', 'b']
res = re.findall('a(b)(c)d', 'abcdabcdabcd')  # 若有两个括号,则优先展示括号内匹配的结果,在将结果组成元组组成列表
print(res)
# run:[('b', 'c'), ('b', 'c'), ('b', 'c')]
res = re.findall('a(?:b)cd', 'abcdabcdabcd')  #  findall在括号内加?:可以取消优先展示
print(res)
# run:['abcd', 'abcd', 'abcd']
  • 在search括号内用()将正则表达式括起来,可以用group选择优先展示那个括号的匹配结果
res = re.search('a(b)(c)d', 'abcdabcdabcd')  # 优先展示括号内匹配的结果
print(res.group())  # 加group取消优先展示
# run:abcd
print(res.group(0))  # group括号内是0和没有一样是取消优先展示
# run:abcd
print(res.group(1))  # group括号内是1优先展示第1个括号的匹配结果
# run:b
print(res.group(2))  # group括号内是2优先展示第2个括号的匹配结果
# run:c
  • 在search括号内用?P<>可以将优先展示的匹配结果加个对应的名字,这样就可以用group括号里加名字,选择优先展示名字的匹配结果
res = re.search('a(?P<id>b)(?P<name>c)','abcdabcdabcd')  # 在()内?P<后写名字>后写名字对应的筛选条件
print(res.group())  # 加group取消优先展示
# run:abc
print(res.group(1))  # group括号内是1优先展示第1个括号的匹配结果
# run:b
print(res.group('id'))  # group括号内可以根据名字获取名字对应的匹配结果
# run:b
print(res.group('name'))  # group括号内可以根据名字获取名字对应的匹配结果
# run:c

网络爬虫

网络爬虫简介

1.互联网
互联网可以将计算机连接到一起,让接入互联网的计算机可以共享数据,有些计算机是专门让别人访问的,被称为服务器,让我们可以通过互联网使用别人的资源

2.网络爬虫的本质
网络爬虫是一种按照一定的规则,自动从抓取信息的程序
模拟计算机浏览器朝目标网址发送请求回去数据并筛选
只要浏览器可以访问的数据网络爬虫理论上都可以

3.网络爬虫虽然好用,但要合法使用,不然一不小心就会获得银手镯

img

第三方模块下载

  • cmd
1.第三方模块需要下载才可以导入使用,python下载第三方模块需要pip工具
2.下载命令
pip3.8 install 模块名
3.下载的问题
3.1下载速度很慢
pip工具默认从国外下载模块,可以更换下载地址源
pip3.8 install 模块名 -i 源地址
"""
下载源地址
中科院:https://pypi.mirrors.ustc.edu.cn/simple/
清华大学 :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/
"""
3.2下载报错
"""
1.pip工具版本过低,拷贝信息提示里的共享命令即可
python38 -m pip install --upgrade pip
2.网络不稳定 报错关键字Read timed out
只能重新下载,或者换一个稳定的网络
3.有些模块在下载使用之前需要提前配置指定的环境
"""
4.模块也有版本
pip3.8 install 模块名==版本号
  • pycharm
pycharm也可以下载模块
File>>>settings>>>project:文件夹名>>>python lnterpreter
在右侧的界面中是现在有的模块信息,随便双击一个模块,在上方的搜索条中可以搜索需要下载的模块,点击需要下载的模块名,在点击lnstall Package下载
在lnstall Package右侧的Manage Repositories可以添加或删除下载源地址

爬取信息

红牛分公司	http://www.redbull.com.cn/about/branch

import requests

res = requests.get('http://www.redbull.com.cn/about/branch')  # 朝目标地址发送网络请求获取地址的页面数据
print(res.content)  # 获取bytes类型的数据
print(res.text)  # 获取解码之后的数据
with open(r'hn.html', 'wb') as f:
    f.write(res.content)  # 将获取的数据储存到文件,之后使用起来更加的方便

import re

with open(r'hn.html', 'r', encoding='utf8') as f:
    data = f.read()  # 读取储存在文件里的页面数据
print(data)

company = re.findall('<h2>(.*?)</h2>', data)  # 在分公司名字的前后字符中间用括号将.*?括起来
# print(company)  # 所有分公司的名字会组成列表

address = re.findall("data-describe='(.*?)'><h2>", data)  # 在分公司地址的前后字符中间用括号将.*?括起来
# print(address)  # 所有分公司的地址会组成列表

mailbox = re.findall("class='mailIco'>(.*?)</p><p", data)  # 在分公司邮箱的前后字符中间用括号将.*?括起来
# print(mailbox)  # 所有分公司的邮箱会组成列表

phone = re.findall("class='telIco'>(.*?)</p>", data)  # 在分公司电话的前后字符中间用括号将.*?括起来
# print(phone)  # 所有分公司的电话会组成列表

info = zip(company, address, mailbox, phone)  # 将列表内的数据值一个对一个取出组成元组,将这些元组组成列表

for i in info:  # 循环打印出来
    print("""
    公司名称:%s
    公司地址:%s
    公司邮箱:%s
    公司电话:%s
    """ % i)
img

openpyxl模块

openpyxl模块有什么用

1.我们可以通过openpyxl模块操作Excel表格
2在python中能够Excel表格的模块有很多,openpyxl模块是近年来用的较多的模块,表格openpyxl模块对03年之前的版本兼容性不好
3.xlwt、xlrd也可以操作Excell表格,可以兼容所有版本的Excel表格,但没有openpyxl简单
4.分辨Excel版本
03年之前的excel文件的后缀名 .xls
03年之后的excel文件的后缀名 .xlsx

openpyxl模块的使用

from openpyxl import Workbook  # 导入模块

wb = Workbook()  # 创建Excel文件
wb1 = wb.create_sheet('魏国')  # 创建表格名字
wb2 = wb.create_sheet('蜀国', 0)  # 可选择表格位置
wb1.title = '曹操'  # 可以修改表格的名字
wb1.sheet_properties.tabColor = '1072BA'  # 修改表格的颜色


wb2['B2'] = '赵云'  # 将赵云写入表格的B行2列

wb2.cell(row=3, column=1, value='关羽')  # 将关羽写入表格的3行1列
# 批量写入
wb2.append(['name', 'pwd', 'age', 'hobby'])
wb2.append(['jay', '123', '20', 'run'])
wb2.append(['barry', '123', '20', 'run'])
wb2.append(['wally', '123', '20', 'run'])
wb2.append(['bart', '123', '20', 'run'])

wb.save(r'110.xlsx')  # 保存文件
img

作业

# 尝试将红牛分公司数据保存到excel表格中

import requests
import re
from openpyxl import Workbook  # 导入模块

res = requests.get('http://www.redbull.com.cn/about/branch')  # 朝目标地址发送网络请求获取地址的页面数据
print(res.content)  # 获取bytes类型的数据
print(res.text)  # 获取解码之后的数据
with open(r'hn.html', 'wb') as f:
    f.write(res.content)  # 将获取的数据储存到文件,之后使用起来更加的方便
with open(r'hn.html', 'r', encoding='utf8') as f:
    data = f.read()  # 读取储存在文件里的页面数据
company = re.findall('<h2>(.*?)</h2>', data)  # 在分公司名字的前后字符中间用括号将.*?括起来
address = re.findall("data-describe='(.*?)'><h2>", data)  # 在分公司地址的前后字符中间用括号将.*?括起来
mailbox = re.findall("class='mailIco'>(.*?)</p><p", data)  # 在分公司邮箱的前后字符中间用括号将.*?括起来
phone = re.findall("class='telIco'>(.*?)</p>", data)  # 在分公司电话的前后字符中间用括号将.*?括起来
info = zip(company, address, mailbox, phone)  # 将列表内的数据值一个对一个取出组成元组,将这些元组组成列表
wb = Workbook()  # 创建Excel文件
wb1 = wb.create_sheet('红牛信息')  # 创建表格名字
wb1.append(['分公司名', '分公司地址', '分公司邮箱', '分公司电话'])
for company, address, mailbox, phone in info:  # 将信息分成不同的变量名来循环
    wb1.append([company, address, mailbox, phone])  # 将循环的信息写入Excel表格
wb.save(r'110.xlsx')  # 保存文件

标签:run,openpyxl,括号,res,爬虫,re,模块,print
来源: https://www.cnblogs.com/riuqi/p/16499818.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有