• Python爬取某东商城的图书信息


    我要爬取的是 中国当代小说的信息 书名和价格 并保存到本地
    1.其实一开始就是想试下
    2.对数据分析的时候要确定是 HTML的数据结构还是 json,还是xml
    结构化数据:json,xml等
    处理方式:直接转化为python类型
    非结构化数据:HTML
    处理方式:正则表达式、xpath
    这里的就是HTML格式的数据 所以用的是xpath 进行解析,筛选我们想要的数据
    3.下面试我的分析过程

    “”"
    分析:
    1.数据是HTML类型还是json类型
    –html类型
    2. 通过xpath调式发现
    – (1)取到的数据只有部分
    – (2)鼠标往下拖动,有数据的加载(再次发送了请求)

    3.一页数据应该有60本书
    //div[@class=“gl-i-wrap”]/div[@class=“p-name”]/a[@target="_blank"]/em/text()

    4.需要通过js的触发,,滚条的拖动,才能够加载出来全部的页面,获取到60本书的数据
    所以在这里要做一个拖动滚动条的操作,下面的步骤3可以看到
    5.在拖动滚动条之前页面应该要渲染的差不多了,不然页面没有渲染出来就拖动滚动条就会报错了
    所以在拖动滚动条那一步之前加了一个chrome_obj.set_page_load_timeout(5) 延时等待操作,等待五秒之后就继续走下面的代码
    一般来说5秒钟的话 页面已经渲染完了,所以也没什么大问题了
    6.另外一点值得注意的是:所有的xpath语法都是我自己用Xpath Helper 调试出来的,并非所有的页面都是用这样语法,所以要结合实际
    “”"

    源代码就是这样的:

    1. 导入selenium,导入延时模块
      from selenium import webdriver
      import time

    解析lxml
    from lxml import etree

    页面加载等待的异常处理
    from selenium.common.exceptions import TimeoutException

    导入json
    import json

    程序入口
    if name == ‘main’:

    1.创建浏览器对象

    chrome_obj = webdriver.Chrome()

    2. 演示的例子是输入京东的:中国当代小说 一共有100个翻页 一个翻页是60本书 ,也就是有100*60 = 6000本书的数据

    chrome_obj.set_page_load_timeout(5)
    try:
    chrome_obj.get('https://list.jd.com/list.html?cat=1713,3258,3297&page=1&sort=sort_totalsales15_desc&trans=1&JL=4_2_0#J_main') # 这个是我要爬取的中国当代小说的url

    except:
    print("超时了......")

    3.进行拖动条的滚动

    for i in range(8): # 0~7
    time.sleep(0.5)
    j =(i+i) *500
    js_ = f"document.documentElement.scrollTop={j}"
    chrome_obj.execute_script(js_) # 执行滚动条

    代码走到这里,已经发送了第二次请求,页面 已经有了60本书

    4.获取当前页面的html源代码

    str_data = chrome_obj.page_source

    5.解析书名

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    在这里插入图片描述

    html_obj = etree.HTML(str_data)
    title_list = html_obj.xpath('//div[@class="gl-i-wrap"]/div[@class="p-name"]/a[@target="_blank"]/em/text()')
    print(title_list)
    print(len(title_list))

    分隔开 看清楚点

    print(''100)

    6.解析价格

    1
    2
    3
    4
    5
    6
    7
    8
    在这里插入图片描述

    price_list = html_obj.xpath('//strong/i/text()')
    print(price_list)
    print(len(price_list))

    7.保存到本地

    with open('京东图书.json','a',encoding='utf-8') as f:
    for i in range(len(title_list)):
    dict_ = {} # 給它整个空字典 用来放数据
    dict_[title_list[i]] = price_list[i]
    json_data = json.dumps(dict_,ensure_ascii=False) + ', '
    f.write(json_data)

    time.sleep(3)

    关闭浏览器

    chrome_obj.quit()
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    “”"
    关于进度条的滚动,不建议一次滚动到底,
    第一次滚动到500
    第二次滚动到1000
    第三次滚动到1500
    一直往下滚动到底
    “”"
    运行结果如下:
    在这里插入图片描述

  • 相关阅读:
    BAT 批处理 for循环 迟环境变量 [MD]
    adb 环境配置 常用命令 [MD]
    XML 解析 DOM SAX PULL 序列化 总结 [MD]
    instanceof 和 isInstance 强转 类型 class [MD]
    Charles 简介 总结 HTTP 抓包 代理 [MD]
    Permission 运行时权限 总结 翻译 [MD]
    反编译 AndroidKiller 逆向 字节码 实践案例 [MD]
    Gradle 翻译 Analyzer APK文件分析 [MD]
    Java 中 boolean 类型占用多少个字节 [MD]
    Shell 命令行工具 Cmder Babun Zsh [MD]
  • 原文地址:https://www.cnblogs.com/lyck/p/13963069.html
Copyright © 2020-2023  润新知