码迷,mamicode.com
首页 > 其他好文 > 详细

Spider(二)

时间:2018-11-24 17:10:04      阅读:234      评论:0      收藏:0      [点我收藏+]

标签:使用场景   图片   场景   代码   mpi   pytho   csv文件   encoding   column   

1、解析模块
   1、数据的分类
     1、结构化数据
           特点 :有固定的格式,如 :HTML、XML、JSON
     2、非结构化数据
           示例 :图片、音频、视频,这类数据一般都以二进制方式存储
   2、正则表达式 re
     1、使用流程
         1、创建编译对象 :p = re.compile("正则表达式")
         2、对字符串进行匹配 :r = p.match("字符串")
         3、获取匹配结果 :print(r.group())
     2、常用方法
         1、match(html) :字符串开头的第1个,返回对象
         2、search(html):从开始往后找,匹配第1个,返回对象
         3、findall(html):所有全部匹配,返回一个列表
         4、group()  :从match或search返回对象中取值
     3、表达式
         . :匹配任意字符(不包括\n)
         \d:数字
         \s:空白字符
         \S:非空白字符
         \w:字母、数字、(下划线)_
         [...]:包含[]内容 :A[BCD]E  --> ABE  ACE  ADE

        *  0次或多次
         ?  0次或1次
         +  1次或多次
         {m} m次
         {m,n} m-n次  AB{1,3}C --> ABC ABBC ABBBC
     4、贪婪匹配与非贪婪匹配
           贪婪匹配(.*) :在整个表达式匹配成功的前提下,尽可能多的匹配*
         非贪婪匹配(.*?) :在整个表达式匹配成功的前提下,尽可能少的匹配*   
     5、findall()的分组
         import re
         #解释 :先按照整体匹配出来,然后再匹配()中的
         # 如果有2个或者多个(),则以元组的方式取显示

        s = "A B C D"
         p1 = re.compile(‘\w+\s+\w+‘)
         print(p1.findall(s))
         # [‘A B‘,‘C D‘]

        p2 = re.compile(‘(\w+)\s+\w+‘)
         # 第1步 :[‘A B‘,‘C D‘]
         # 第2步 :[‘A‘,‘C‘]
         print(p2.findall(s))

        p3 = re.compile(‘(\w+)\s+(\w+)‘)
         # 第1步 :[‘A B‘,‘C D‘]
         # 第2步 :[(‘A‘,‘B‘),(‘C‘,‘D‘)]
         print(p3.findall(s))
     6、练习
         <div class="animal">
           <p class="name">
             <a title="tiger"></a>
           </p>
          
           <p class="contents">
             Two tigers two tigers run fast       
           </p>
         </div>
        
         <div class="animal">
           <p class="name">
             <a title="rabbit"></a>
           </p>
          
           <p class="contents">
             Small white rabbit white and white
           </p>
         </div>
         第一步:
           [(‘tiger‘, ‘Two tigers two tigers run fast‘), (‘rabbit‘, ‘Small white rabbit white and white‘)]
         第二步:
           动物名称:tiger
           动物描述:Two tiger ...
           正则:p = re.compile(‘<div class="animal".*?title="(.*?)">.*?contents">(.*?)</p>‘,re.S)
   3、案例1:内涵段子脑筋急转弯抓取
     网址 :www.neihan8.com
     步骤:
         1、找URL规律
         第1页:https://www.neihan8.com/njjzw/index.html
         第2页:https://www.neihan8.com/njjzw/index_2.html
         第3页:https://www.neihan8.com/njjzw/index_3.html
         2、用正则匹配出 题目 和 答案
         p = re.compile(‘<div class="text-.*?title="(.*?)".*?<div class="desc">(.*?)</div>‘,re.S)
         3、写代码
         1、发请求
         2、用正则匹配
           <div class="text-column-item.*?title="(.*?)">.*?class="desc">(.*?)</div>
         3、写入本地文件
     见 :04_内涵8脑筋急转弯抓取.py
   4、猫眼电影top100榜单,存到csv表格文件里
     网址:猫眼电影 - 榜单 - top100榜
     目标:抓取电影名、主演、上映时间
     1、知识点讲解
         1、csv模块的使用流程
         1、打开csv文件
             with open("测试.csv","a",newline="") as f:
         2、初始化写入对象
             writer = csv.writer(f)
         3、写入数据(列表)
             writer.writerow([列表])
         2、见 :06_猫眼电影top100.py
     2、准备工作
         1、找URL
         第1页:http://maoyan.com/board/4?offset=0
         第2页:http://maoyan.com/board/4?offset=10
         第n页:offset = (n-1)*10
         2、正则匹配
         <div class="movie-item-info">.*?title="(.*?)".*?class=="star">(.*?)</p>.*?class="releasetime">(.*?)</p>   
         3、写代码
        
2、数据持久化存储
   1、存入mongodb数据库(pymongo模块回顾)
     import pymongo
     # 创建连接对象
     conn = pymongo.MongoClient("localhost",27017)
     # 创建数据库对象
     db = conn.库名
     # 创建集合对象
     myset = db.集合名
     # 插入数据
     myset.insert(字典)
     >>>mongo
     >>>show dbs
     >>>use 库名
     >>>show collections
     >>>db.集合名.find().pretty()
     >>>db.dropDatabase()
     >>>db.集合名.count()
   2、存入MySQL数据库(pymysql模块回顾)

3、requests模块
   1、安装(用管理员身份去打开Anaconda Prompt)
     Anaconda   : conda install requests
     Windows cmd: python -m pip install requests
           ## python -m是以管理员身份去执行pip安装命令
     Ubuntu     :sudo pip3 install requests
   2、常用方法
     1、requests.get(url,headers=headers)
         发起请求,获取响应对象
     2、响应对象的response属性
         1、res.text   :返回字符串类型
         2、res.content: 返回bytes类型
         应用场景 :爬取非结构化数据
         3、res.encoding:指定字符编码(一般为ISO-8859-1)
         response.encoding = "utf-8"
         4、res.status_code:返回服务器响应码
         5、res.url        : 返回实际数据的URL地址
     3、get()使用场景
         1、没有查询参数
         res = requests.get(url,headers=headers)
             2、有查询参数(params={})
         res = requests.get(url,params=params,headers=headers)
         注 :params参数必须为字典,自动进行编码
     4、post() 参数名 :data
         1、data = {}
         2、示例 :10_有道翻译post.py

Spider(二)

标签:使用场景   图片   场景   代码   mpi   pytho   csv文件   encoding   column   

原文地址:https://www.cnblogs.com/py321/p/10012665.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!