爬虫及部分模块

re模块和网络爬虫

  • re模块
  • 网络爬虫简介
  • 第三方模块的下载
  • 爬取数据
  • excel文件
    1. 简介
    2. 创建
    3. 写入表格数据

re 模块

  • re 模块的方法

    方法 作用
    findall('a',' 元素 ') 返回所有满足匹配条件的结果,放在列表里
    finditer( ) 和findall 作用一致,会将结果处理成迭代器对象,节省内存
    search('a','字符串') 在字符串中查找,找到第一个相匹配的直接返回一个包含匹配信息的对象
    match( ) 和search一样,只找一个,切只找开头的哪一个是返回不是则为None
    compole( ) 提前准备好正则 , 之后可以反复使用,减少代码冗余
  • re 模块 方法的详情

    1. findall( )

      import re
      res = re.findall('a', 'jason oscar aaa')  
      print(res)        # ['a', 'a', 'a', 'a', 'a']
      

      findall通过正则表达式筛选出文本中所有符合条件的数据

    2. 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作用一致 只不过结果会被处理成迭代器对象 用于节省内存

    3. 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

    4. match( )

      import re
      res = re.match('a', 'jason oscar aaa')
      print(res)   # None
      

      作用和search一致,但match通过正则表达式从头开始匹配 如果头部已经不符合 那么后面不走了,直接返回None

    5. compole( )

      import re
      obj = re.compile('a')
      print(re.findall(obj,'asjd21hj13123j'))
      print(re.findall(obj,'fdh3jh45jhqjha'))
      print(re.findall(obj,'asdasdadadasda'))
      
      

      ​ 将正则表达式编译成为一个 正则表达式对象,然后再调用re模块的方法来取出

  • re模块的用法

    1. 分组

      	 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的特性,返回的值可看成列表。索引取值的是列表内取出的值

    2. 别名

      	 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'))
      

      ​ 能通过别名的方法快速获取所需的值

网络爬虫

  • 什么是互联网

    ​ 将全世界的计算机连接到一起组成的网络

  • 互联网发明的目的

    ​ 将接入互联网的计算机上面的数据彼此共享

  • 上网的本质

    ​ 基于互联网访问别人计算机上面的资源(有些计算机存在的意义就是让别人访问,这种类型的计算机我们也称之为服务器)

  • 网络爬虫的本质

    ​ 模拟计算机浏览器朝目标网址发送请求回去数据并筛选

    ​ 只要是浏览器可以访问到的数据网络爬虫理论上都可以

第三方模块

  • 如何使用

    1. 第三方模块必须先下载才可以导入使用

    2. python下载第三方模块需要借助pip工具

    3. 下载命令

      pip3.6 install 模块名

      先通过cmd命令符下载pip

      image

    4. 在pycharm中下载

      image

  • 下载的时候出现的问题

    1. 下载很慢

      ​ pip工具默认是从国外的仓库地址下载模块 速度很慢

      ​ pip3.6 install 模块名 -i 源地址

      pycharm提供第三方模块下载快捷方式,也可以直接修改python解释器源文件

    2. 下载报错

      1. pip工具版本过低 直接拷贝提示信息里面的更新命令即可
        python36 -m pip install --upgrade pip
      2. 网络波动 关键字是Read timed out
        只需要重新下载几次即可 或者切换一个网络稳定一点的
      3. 有些模块在下载使用之前需要提前配置指定的环境
        结合具体情况 百度搜索

爬公司的信息

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)

image

excel

  • openpyxl 模块

    ​ 1. openpyxl模块的认识:

    ​ 主要用于操作excel表格 也是pandas底层操作表格的模块

    ​ 在python中能够操作excel表格的模块有很多
    ​ openpyxl属于近几年比较流行的模块
    ​ openpyxl针对03版本之前的excel文件兼容性不好
    ​ xlwt、xlrd也可以操作excel表格
    ​ 兼容所有版本的excel文件 但是使用方式没有openpyxl简单

    1. excel 版本问题

      03版本之前 excel文件的后缀名 .xls

      03版本之后 excel文件的后缀名 .xlsx
      如果是苹果电脑excel文件的后缀 .csv

    2. 下载模块

      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')
    
posted @ 2022-07-20 20:02  Nirvana*  阅读(37)  评论(0)    收藏  举报