爬虫day05 动态网站爬取,json模块 selenium , phantomjs , BeautifulSoup

目录

1.糗事百科-xpath

2.动态网站数据抓取 - Ajax

3.json模块

4.selenium + phantomjs 强大的网络爬虫

    1.selenium

    2.phantomjs

    3.常用方法

5.BeautifulSoup

糗事百科xpath匹配答案

豆瓣网登录

扫描二维码关注公众号,回复: 3193846 查看本文章

斗鱼主播名字和观众人数

 

1.糗事百科-xpath

    1.目标:用户昵称 段子内容 好笑数 评论数
    2.步骤
        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

2.动态网站数据抓取 - Ajax

    1.Ajax动态加载
        1.特点:动态加载(滚动鼠标滑轮时加载)
        2.案例:豆瓣电影top100榜单(剧情)

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

3.json模块

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

4.selenium + phantomjs 强大的网络爬虫

    1.selenium

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

            from selenium import webdriver

    2.phantomjs

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

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

    3.常用方法

        1.driver.get(url)
        2.driver.page_source.find("内容")
            1.作用:从html源码中搜索字符串
                搜索成功:非-1
                不成功:-1
        3.driver.find_element_by_id("属性值").text
        4.driver.find_element_by_name("属性值")
        5.driver.find_element_by_class_name("属性值")
        6.对象名.send_keys("内容")
        7.对象名.click()
        8.driver.quit()

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)
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.案例:登录豆瓣网站
    5.案例:斗鱼直播抓取(JS分页加载,动态模拟点击)
        1.抓取目标:主播 观众人数
            1.主播:span class="dy-name ellipsis fl"
            2.人数:span class="dy-num fr"
            3.下一页:
                能点:a class="shark-pager-next"
                不能点:a class="shark-pager-next shark-pager-disable shark-pager-disable-next"

5.BeautifulSoup

    1.定义:HTML或XML的解析器,依赖于lxml库
    2.安装并导入
        安装:pip install beautifulsoup4
              conda install beautifulsoup4
        安装模块出错处理
        1.conda install selenium --> 报错
            卸载:conda uninstall selenium
            安装:cmd 右键-->管理员身份打开
                  python -m pip install selenium
        导入模块:from bs4 import BeautifulSoup as bs
    3.示例
        html="<div>九霄龙吟惊天变,风云际会浅水游</div>"

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' 速度快

糗事百科xpath匹配答案

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

豆瓣网登录

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

斗鱼主播名字和观众人数

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

猜你喜欢

转载自blog.csdn.net/zh__quan/article/details/82708491