本文为学习笔记,部分内容为老师所写,非纯原创

目录

浏览器操作软件介绍

DrissionPage安装

DrissionPage演示

抓取震坤行商品

实现异步请求的方案

抓取刺猬猫某本小说三章数据

监听美团接口的代码

浏览器操作软件介绍

        这三个软件都是用python代码打开浏览器去执行操作。开发者工具能看见的数据是经过js处理过的,实际代码里可能接口加密了,因此普通爬取数据爬不到,这时候就可以用以下三种软件绕过接口加密:

  • Selenium:不支持异步操作,打开网站后变量可能和人操作时不一样,不防检测,易被封。
  • Pyppepteer:绕过接口加密,直接访问获取网站信息,支持异步,有js脚本可以修改可能被检测的变量。
  • DrissionPage:比Pyppepteer多功能,很多大网站Pyppepteer已经不行了。

DrissionPage安装

        网站:http://drissionpage.cn/
        #安装
        pip install DrissionPage
        #升级
        pip install DrissionPage -- upgrade

DrissionPage演示

抓取震坤行商品

from DrissionPage import ChromiumPage
import time


page = ChromiumPage()
# page = ChromiumPage()这句意思是打开一个浏览器,这个浏览器是安装DrissionPage时自动安装的

# 跳转到震坤行页面
page.get('https://www.zkh.com/?utm_source=baidu&utm_medium=CPT')

# page.ele('#key').input('大地瓜'),input是DrissionPage的语法,意思是往这个文本框里填大地瓜三个字
page.ele('xpath://*[@id="app"]/div/div/div[3]/div/div[1]/div[1]/input').input('口罩')

# 定位到点击,点击搜索按钮
page.ele('xpath://*[@id="app"]/div/div/div[3]/div/div[1]/button/span').click()

# 切换到最新打开的标签页,因为搜索之后会跳转到新窗口,在原窗口什么都获取不到
page.to_tab(page.latest_tab)
# 也可以用page.to_tab(page.tabs[0])切换到其他窗口,0就是第一个窗口,以此类推


while True:
    page.wait.load_start()
    # 等待网页加载

    # 让滚动条往下拖,由于该网站最少拖两次才能加载完全,这里拖三次以防万一
    # 如果还是没加载完全,可以多加几个,或者等待时间长点
    page.scroll.to_location(0,10000)
    time.sleep(0.5)
    page.scroll.to_location(0,10000)
    time.sleep(0.5)
    page.scroll.to_location(0,10000)
    time.sleep(0.5)

    divs = page.eles('xpath://div[@class="goods-name clamp2"]')
    # 获取商品对象,因为是多个,所以加了s,page.eles
    # 获取的是对象列表,需要进行遍历,i就是div对象
    for i in divs:
        title = i.attr('title')
        # 获取div对象里的title属性
        print(title)
    # 获取下一页按钮,有就点击
    print(len(divs))

    # 找超链接或者按钮中间元素有没有下一页三个字,找不到两秒报错
    btn = page('下一页', timeout=2)
    if btn:
        btn.click()
        page.wait.load_start()
    # 没有则退出程序
    else:
        break
# page.scroll.to_bottom()
# # 滚动到指定位置
# page.run_js('window.scrollBy(0, document.body.scrollHeight)')
# # 滚动页面使自己可见
# page.scroll.down(4000)
# page.run_js(' return document.body.scrollHeight')

实现异步请求的方案

        运行后可以看见同时打开了两个网站抓取数据

from threading import Thread
from DrissionPage import ChromiumPage
from DataRecorder import Recorder
def collect(tab, recorder, title):
    """用于采集的方法
    :param tab: ChromiumTab 对象
    :param recorder: Recorder 记录器对象
    :param title: 类别标题
    :return: None
    """
    num = 1 # 当前采集页数
    while True:
    # 遍历所有标题元素
        for i in tab.eles('.title project-namespace-path'):
    # 获取某页所有库名称,记录到记录器
            recorder.add_data((title, i.text, num))
    # 如果有下一页,点击翻页
        btn = tab('@rel=next', timeout=2)
        if btn:
            btn.click(by_js=True)
            tab.wait.load_start()
            num += 1
        # 否则,采集完毕
        else:
            break
def main():
    # 新建页面对象
    page = ChromiumPage()
    # 第一个标签页访问网址
    page.get('https://gitee.com/explore/ai')
    # tab = page.get_tab(1) # 获取列表中第二个标签页的对象
    # 获取第一个标签页对象,这个东西我认为等于一个page,一个窗口的句柄
    tab1 = page.get_tab()
    print(tab1)
    # 新建一个标签页并访问另一个网址
    tab2 = page.new_tab('https://gitee.com/explore/machine-learning')
    # 获取第二个标签页对象
    tab2 = page.get_tab(tab2)
# 新建记录器对象
    recorder = Recorder('data.csv')
    # 多线程同时处理多个页面
    Thread(target=collect, args=(tab1, recorder, 'ai')).start()
    Thread(target=collect, args=(tab2, recorder, '机器学习')).start()
if __name__ == '__main__':
    main()

抓取刺猬猫某本小说三章数据


# encoding:utf-8
#不知道为啥不加上边encoding就不能执行
from DrissionPage import ChromiumPage

count = 1
page = ChromiumPage()
# page = ChromiumPage()这句意思是打开一个浏览器,这个浏览器是安装DrissionPage时自动安装的

page.get('https://wap.ciweimao.com/chapter/108689198')

while True:

    chapter=page.ele('.read-hd')
    print(chapter.text)
    contents = page.eles('.chapter')
    for i in contents:
        print(i.text)

    # 获取商品对象,因为是多个,所以加了s,page.eles
    # 获取的是对象列表,需要进行遍历,i就是div对象

    # 找超链接或者按钮中间元素有没有下一页三个字,找不到两秒报错
    btn = page('下一章', timeout=2)
    if btn:


        if count<3:
            btn.click()
            page.wait.load_start()
            count += 1
        else:
            break
    # 没有则退出程序
    else:
        break
# page.scroll.to_bottom()
# # 滚动到指定位置
# page.run_js('window.scrollBy(0, document.body.scrollHeight)')
# # 滚动页面使自己可见
# page.scroll.down(4000)
# page.run_js(' return document.body.scrollHeight')

监听美团接口的代码

这部分属于进阶功能,需要一个包 FlowViewer: Chrome 浏览器数据包检测器。 (gitee.com)
# from DrissionPage.tools import Listener
from FlowViewer import Listener
listener =Listener(9222) # 创建监听器,监听9222端口的浏览器
listener.set_targets('health/brand/operation/data/trade') # 设置需要监听的url
listener.listen(count=10) # 开始监听,接收到10条目标url的请求后停止
for i in listener.steps():
    print(i.body) # 打印实时打印监听到的内容
listener.stop() #停止监听

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐