python 爬虫day05

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/luohongtuCSDN/article/details/82893835

目录:

Day05笔记

糗事百科-xpath

目标 : 用户昵称 段子内容 好笑数 评论数

步骤

  1. 找URL
    https://www.qiushibaike.com/8hr/page/1/

  2. xpath匹配
    基准的xpath每个段子 : //div[contains(@id,“qiushi_tag_”)]
    用户昵称 : ./div/a/h2
    段子内容 : .//div[@class=“content”]/span
    好笑数量 : .//i
    评论数量 : .//i

  3. 代码:

    import requests
    from lxml import etree
    import pymongo
    
    class QiuShiSpider:
        def __init__(self):
            self.url = "https://www.qiushibaike.com/8hr/page/8/"
            self.headers = {"User-Agent":"Mozilla5.0"}
            self.conn = pymongo.MongoClient("localhost",27017)
            self.db = self.conn.BaiKe
            self.myset = self.db.baiketab
            
        def getPage(self):
            res = requests.get(self.url,headers=self.headers)
            res.encoding = "utf-8"
            html = res.text
            self.parsePage(html)
        
        def parsePage(self,html):
            parseHtml = etree.HTML(html)
            # 基准xpath,每个段子节点对象的列表
            base_list = parseHtml.xpath('//div[contains(@id,"qiushi_tag_")]')
            # 遍历每个段子的节点对象
            for children in base_list:
                # 用户昵称
                username = children.xpath('./div/a/h2')[0].text
                # 段子内容
                content = children.xpath('.//div[@class="content"]/span')[0].text
                # 好笑数量
                laughNum = children.xpath('.//i')[0].text
                # 评论数量
                pingNum = children.xpath('.//i')[1].text
        
                d = {"username": username.strip(),
                     "content" : content.strip(),
                     "laughNum": laughNum.strip(),
                     "pingNum" : pingNum.strip()
                  }
                self.myset.insert(d)
        
    if __name__ == "__main__":
        spider = QiuShiSpider()
        spider.getPage()
        
    

动态网站数据抓取 - Ajax

  1. Ajax动态加载

    1. 特点 :动态加载(滚动鼠标滑轮时加载)

    2. 抓包工具 :查询参数在 WebForms -> QuerySting

    3. 案例 :豆瓣电影top100榜单(剧情)

    4. 豆瓣电影 -> 排行榜 -> 剧情:

      import requests
      import json
      import csv
      
      url = "https://movie.douban.com/j/chart/top_list?"
      params = {"type":"11",
                "interval_id":"100:90",
                "action":"",	
                "start":"0",
                "limit":"200"}
      
      headers = {"User-Agent":"Mozilla5.0"}
      
      res = requests.get(url,params=params,headers=headers)
      res.encoding = "utf-8"
      # 得到的json格式的数组[]
      html = res.text
      # 把json格式的数组转为python的列表
      L = json.loads(html)
      
      for film in L:
          score = film["rating"][0]
          name = film["title"]
          
          with open("豆瓣100.csv","a",newline="") as f:
              writer = csv.writer(f)
              writer.writerow([name,score])
      
  2. json模块

    1. 作用 : json格式类型 和 Python数据类型 相互转换
    2. 常用方法
      1. json.loads() : json格式 --> Python数据类型
        json python
        对象 字典
        数组 列表

      2. json.dumps()

      3. 代码实例:

        import json
        s1 = '[1,2,3,4]'
        L = json.loads(s1)
        print(type(L))
        
  3. selenium + phantomjs 强大的网络爬虫

    1. selenium

      1. 定义 : Web自动化测试工具,应用于Web自动化测试
      2. 特点
        • 可运行在浏览器上,根据指令操作浏览器,让浏览器自动加载页面
        • 只是工具,不支持浏览器功能,只能与第三方浏览器结合使用
      3. 安装
        conda install selenium
        pip install selenium
        验证:
        from selenium import webdriver
    2. phantomjs

      1. 定义 : 无界面浏览器(无头浏览器)
      2. 特点
        1.把网站加载到内存执行页面加载
        2.运行高效
      3. 安装
        1. Windows
          1. 下载路径: 百度网盘下载
          2. 把安装包拷贝到 Python安装路径Scripts…
            C:\Python36\Scripts
          3. 打开终端 : phantomjs
            phantomjs>
      4. Ubuntu
        1. 下载phantomjs安装包放到一个路径下
        2. 用户主目录 : vi .bashrc
          export PHANTOM_JS=/home/.../phantomjs-..文件名
          export PATH=$PHANTOM_JS/bin:$PATH
        3. source .bashrc
        4. 终端 : phantomjs
    3. 示例代码

      1. for example:

        # 导入selenium库中的webdriver
        from selenium import webdriver
        # 创建打开phantomjs的对象
        driver = webdriver.PhantomJS()
        # 访问百度
        driver.get("http://www.baidu.com/")
        # 获取网页截图
        driver.save_screenshot("百度.png")
        
      2. for example:

        from selenium import webdriver
        # 操作键盘鼠标
        from selenium.webdriver.common.keys import Keys
        import time
        
        driver = webdriver.PhantomJS()
        driver.get("http://www.baidu.com/")
        # 查找搜索框位置
        driver.find_element_by_id("kw").send_keys(u"美女")
        #driver.save_screenshot("美女.png")
        driver.find_element_by_id("su").click()
        time.sleep(3)
        driver.save_screenshot("搜索.png")
        
        
    4. 常用方法

      1. driver.get(url)

      2. driver.page_source.find(“内容”)

        1. 作用 : 从html源码中搜索字符串
          搜索成功 : 非-1
          搜索不成功 : -1

        2. for example:

          from selenium import webdriver
          driver = webdriver.PhantomJS()
          driver.get("http://www.baidu.com/")
          r1 = driver.page_source.find("kw") # 能找到 17556
          r2 = driver.page_source.find("aaaaaaa") # 失败-1
          print(r1,r2)
          
      3. driver.find_element_by_id(“属性值”).text

        from selenium import webdriver
        driver = webdriver.PhantomJS()
        driver.get("http://www.baidu.com/")
        result = driver.find_element_by_id("setf").text
        print(result)
        
      4. driver.find_element_by_name(“属性值”)

      5. driver.find_element_by_class_name(“属性值”)

      6. 对象名.send_keys(“内容”)

      7. 对象名.click()

      8. driver.quit()

    5. 案例1 :登陆豆瓣网站 :

      from selenium import webdriver
      # 操作鼠标键盘
      from selenium.webdriver.common.keys import Keys
      # 创建phantomjs浏览器对象
      driver = webdriver.PhantomJS()
      driver.get("https://www.douban.com/")
      driver.save_screenshot("豆瓣首页.png")
      
      # 用户名
      driver.find_element_by_name("form_email")\
                          .send_keys("[email protected]")
      # 密码
      driver.find_element_by_name("form_password")\
                         .send_keys("zhanshen001")
      # 验证码
      key = input("请输入验证码:")
      driver.find_element_by_id("captcha_field")\
                         .send_keys(key)
      # 登录豆瓣
      driver.find_element_by_class_name("bn-submit")\
                         .click()
      driver.save_screenshot("登录成功.png")
      driver.quit()
      
    6. 案例 2 : 斗鱼直播抓取(JS分页加载,动态模拟点击)

      1. 抓取目标 : 主播 观众人数
      2. 主播 : span -> class=“dy-name ellipsis fl”
      3. 人数 : span -> class=“dy-num fr”
      4. 下一页
        能点 : a -> class=“shark-pager-next”
        不能点 :a -> class=“shark-pager-next shark-pager-disable shark-pager-disable-next”
      5. 代码:
        from selenium import webdriver
        from bs4 import BeautifulSoup as bs
        import time
        
        driver = webdriver.PhantomJS()
        driver.get("https://www.douyu.com/directory/all")
        
        while True:
            # 创建解析对象
            soup = bs(driver.page_source,"lxml")
            # 直接调用方法去查找元素
            # 存放所有主播的元素对象
            names = soup.find_all('span',{"class":"dy-name ellipsis fl"})
            numbers = soup.find_all('span',{"class":"dy-num fr"})
            # name,number是一个对象,get_text()
            for name,number in zip(names,numbers):
                print("\t观众人数:",number.get_text().strip(),
                      "\t主播名字:",name.get_text().strip())
            
            if driver.page_source.find("shark-pager-disable-next") == -1:
               driver.find_element_by_class_name("shark-pager-next").click()
               time.sleep(4)
            else:
                break
        
  4. BeautifulSoup

    1. 定义 :HTML或XML的解析器,依赖于lxml库

    2. 安装并导入

      1. 安装 :
        pip install beautifulsoup4
        conda install beautifulsoup4
      2. 安装模块出错处理:
        1. conda install selenium --> 报错
          卸载 :conda uninstall selenium
        2. 安装 :cmd 右键->管理员身份打开
          python -m pip install selenium
        3. 导入模块 :from bs4 import BeautifulSoup as bs
    3. 示例

      from bs4 import BeautifulSoup
      html = "<div>九宵龙吟惊天变,风云际会浅水游</div>"
      # 创建解析对象
      soup = BeautifulSoup(html,'lxml')
      # 查找div标签的文本
      result = soup.div.string
      print(result)
      
    4. BeautifulSoup支持解析库

      1. lxml HTML解析器 ‘lxml’ 速度快,文档容错能力强
      2. Python标准库 ‘html.parser’ 速度一般
      3. lxml XML解析器 ‘xml’ 速度快

猜你喜欢

转载自blog.csdn.net/luohongtuCSDN/article/details/82893835
今日推荐