爬虫及部分模块
re模块和网络爬虫
- re模块
- 网络爬虫简介
- 第三方模块的下载
- 爬取数据
- excel文件
- 简介
- 创建
- 写入表格数据
re 模块
-
re 模块的方法
方法 作用 findall('a',' 元素 ') 返回所有满足匹配条件的结果,放在列表里 finditer( ) 和findall 作用一致,会将结果处理成迭代器对象,节省内存 search('a','字符串') 在字符串中查找,找到第一个相匹配的直接返回一个包含匹配信息的对象 match( ) 和search一样,只找一个,切只找开头的哪一个是返回不是则为None compole( ) 提前准备好正则 , 之后可以反复使用,减少代码冗余 -
re 模块 方法的详情
-
findall( )
import re res = re.findall('a', 'jason oscar aaa') print(res) # ['a', 'a', 'a', 'a', 'a']
findall通过正则表达式筛选出文本中所有符合条件的数据
-
finditer( )
import re res = re.finditer('a', 'jason oscar aaa') print(res) # <callable_iterator object at 0x000001A587AC9190> for i in res: print(i) # <re.Match object; span=(1, 2), match='a'> # <re.Match object; span=(9, 10), match='a'> # <re.Match object; span=(12, 13), match='a'> # <re.Match object; span=(13, 14), match='a'> # <re.Match object; span=(14, 15), match='a'>
finditer与findall作用一致 只不过结果会被处理成迭代器对象 用于节省内存
-
search( )
import re res = re.search('a', 'jason oscar aaa') print(res) # <re.Match object; span=(1, 2), match='a'> print(res.group()) # a
调用re模块的search的时候,只到找到第一个匹配然后返回一个包含匹配信息的对象,通过调用group()方法得到匹配的字符串,如果字符串没有匹配,则返回None
-
match( )
import re res = re.match('a', 'jason oscar aaa') print(res) # None
作用和search一致,但match通过正则表达式从头开始匹配 如果头部已经不符合 那么后面不走了,直接返回None
-
compole( )
import re obj = re.compile('a') print(re.findall(obj,'asjd21hj13123j')) print(re.findall(obj,'fdh3jh45jhqjha')) print(re.findall(obj,'asdasdadadasda'))
将正则表达式编译成为一个 正则表达式对象,然后再调用re模块的方法来取出
-
-
re模块的用法
-
分组
res = re.findall('abc','abcabcabcabc') print(res) # ['abc', 'abc', 'abc', 'abc'] res = re.findall('a(b)c','abcabcabcabc') findall针对分组的正则表达式匹配到的结果 优先展示 print(res) # ['b', 'b', 'b', 'b'] res = re.findall('a(?:b)c','abcabcabcabc') findall也能够取消分组优先展示 (?:) res = re.search('a(b)c','abcabcabcabc') print(res.group()) # abc print(res.group(0)) # abc print(res.group(1)) # b
带()可看成优先展示内容。
分组优先展示是findall的特性,返回的值可看成列表。索引取值的是列表内取出的值
-
别名
res = re.search('a(?P<id>b)(?P<name>c)','abcabcabcabc') print(res.group()) print(res.group(1)) print(res.group('id')) print(res.group('name'))
能通过别名的方法快速获取所需的值
-
网络爬虫
-
什么是互联网
将全世界的计算机连接到一起组成的网络
-
互联网发明的目的
将接入互联网的计算机上面的数据彼此共享
-
上网的本质
基于互联网访问别人计算机上面的资源(有些计算机存在的意义就是让别人访问,这种类型的计算机我们也称之为服务器)
-
网络爬虫的本质
模拟计算机浏览器朝目标网址发送请求回去数据并筛选
只要是浏览器可以访问到的数据网络爬虫理论上都可以
第三方模块
-
如何使用
-
第三方模块必须先下载才可以导入使用
-
python下载第三方模块需要借助pip工具
-
下载命令
pip3.6 install 模块名
先通过cmd命令符下载pip
-
在pycharm中下载
-
-
下载的时候出现的问题
-
下载很慢
pip工具默认是从国外的仓库地址下载模块 速度很慢
pip3.6 install 模块名 -i 源地址
pycharm提供第三方模块下载快捷方式,也可以直接修改python解释器源文件
-
下载报错
- pip工具版本过低 直接拷贝提示信息里面的更新命令即可
python36 -m pip install --upgrade pip - 网络波动 关键字是Read timed out
只需要重新下载几次即可 或者切换一个网络稳定一点的 - 有些模块在下载使用之前需要提前配置指定的环境
结合具体情况 百度搜索
- pip工具版本过低 直接拷贝提示信息里面的更新命令即可
-
爬公司的信息
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()
# 研究目标数据的特征 编写正则筛选
# 1.获取所有的分公司名称
company_name_list = re.findall('<h2>(.*?)</h2>', data)
# print(res)
# 2.获取所有的分公司地址
company_addr_list = re.findall("<p class='mapIco'>(.*?)</p>", data)
# print(company_addr_list)
# 3.获取所有的分公司邮箱
company_email_list = re.findall("<p class='mailIco'>(.*?)</p>", data)
# print(company_email_list)
# 4.获取所有的分公司电话
company_phone_list = re.findall("<p class='telIco'>(.*?)</p>", data)
# print(company_phone_list)
# 5.将上述四个列表中的数据按照位置整合
res = zip(company_name_list, company_addr_list, company_email_list, company_phone_list)
# 6.处理数据(展示 保存 excel)
for i in res: # ('红牛杭州分公司', '杭州市上城区庆春路29号远洋大厦11楼A座', '310009', '0571-87045279/7792')
print("""
公司名称:%s
公司地址:%s
公司邮箱:%s
公司电话:%s
""" % i)
excel
-
openpyxl 模块
1. openpyxl模块的认识:
主要用于操作excel表格 也是pandas底层操作表格的模块
在python中能够操作excel表格的模块有很多
openpyxl属于近几年比较流行的模块
openpyxl针对03版本之前的excel文件兼容性不好
xlwt、xlrd也可以操作excel表格
兼容所有版本的excel文件 但是使用方式没有openpyxl简单-
excel 版本问题
03版本之前 excel文件的后缀名 .xls
03版本之后 excel文件的后缀名 .xlsx
如果是苹果电脑excel文件的后缀 .csv -
下载模块
pip3.6 install openpyxl
-
-
excel创建
from openpyxl import Workbook wb = Workbook() wb1 = wb.create_sheet('拳打鸡哥组') wb2 = wb.create_sheet('脚踏浩哥组') wb1.title = '上海富婆电话簿' # 使用title 可进行二次修改 wb1.sheet_properties.tabColor = "0810BA" # 修改工作簿颜色 wb2.title = '上海富豪闺女信息' wb2.sheet_properties.tabColor = "8588BA" wb.save(r'123.xlsx')
-
excel的写入数据
# 写入方式1 wb2.append(['姓名', '身份']) wb2.append(['流畅','新希望集团刘永好闺女']) wb2.append(['杨惠妍','碧桂园创始人杨国强闺女']) wb2.append(['朱桔榕','合生创展集团创始人朱孟依闺女']) # 写入方式2 wb2['A5'] = '马曼琳' # 写入方式3 wb2.cell(row=5, column=2,value='马化腾之女') wb.save(r'123.xlsx')