吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 7746|回复: 71
收起左侧

[Python 原创] 分享个pyppeteer 通用爬虫(爬取几乎任何网站)

  [复制链接]
hybpjx 发表于 2023-4-21 16:44
本帖最后由 hybpjx 于 2023-4-21 16:46 编辑

突然发现自己之前写过的代码
虽然现在爬虫都逆向了,但是有时候获取个一次性数据,或者不需要维护的时候 pyppeteer  还是非常好用的。
因为pyppeteer 是puppeteer的python 版本  所以不是特别火 网上资料也非常少
.简单记录一下

如果想详细了解
https://zhaoqize.github.io/puppeteer-api-zh_CN/
去看看官网

这边分析一个可以爬取几乎任何网站的一组python代码 写的比较粗糙。
去年八月份写的 也没做什么处理

注!!! 本人发这个网站提供参考,如有其他 不关我事。
示例网站 也不要一直爬取,会给别人带来困扰。

# -*- coding: utf-8 -*-
# home.php?mod=space&uid=238618    : 2022/8/19 13:17
# home.php?mod=space&uid=686208  : lzc
# home.php?mod=space&uid=621973   : hybpjx@163.com
# home.php?mod=space&uid=267492    : __init__.py
# @Software: PyCharm

import asyncio
from pyppeteer import launch

from collections import namedtuple

def screen_size():
    """使用tkinter获取屏幕大小"""
    # 导入gui编程的模块
    import tkinter
    # 创建一个空间界面
    tk = tkinter.Tk()
    # 获得宽高
    width = tk.winfo_screenwidth()
    height = tk.winfo_screenheight()
    tk.quit()
    # 得到返回值
    return width, height

async def main():
    # 默认无头浏览器  沙盒模式
    browser = await launch({'headless': False, 'args': ['--no-sandbox'], })
    # 新开一个page对象
    page = await browser.newPage()
    # 拿到一个尺寸 作为你的谷歌浏览器大小
    width, height = screen_size()
    # 也可以自定义
    await page.setViewport(viewport={"width": width, "height": height})
    # 开启js
    await page.setJavaScriptEnabled(enabled=True)
    # 设置请求头
    await page.setUserAgent(
        'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 '
        '(KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/16.16299'
    )
    # 开启 隐藏 是selenium 让网站检测不到
    await page.evaluate('''() =>{ Object.defineProperties(navigator,{ webdriver:{ get: () => false } }) }''')
    # 访问url
    await page.goto(website.url)

    now_page = 0

    while True:

        now_page += 1
        # 滑动js  动态加载
        await page.evaluate('window.scrollBy(0, document.body.scrollHeight)')
        # 优雅的等待1秒 不会造成 资源阻塞
        await asyncio.sleep(1)
        # xpath
        li_list = await page.querySelectorAll(website.list_query)
        # 可将返回值返回到列表中 可省略
        # item_list = []
        for li in li_list:
            # 防止有些网站 第一条数据获取不到 第二条数据获取的到 故加个try
            try:
                # 找寻下面所有的a标签 详情页链接地址
                title_obj = await li.querySelector("a ")
                # 找到 其 链接地址和链接标题
                title_url = await page.evaluate('(element) => element.href', title_obj)
                title_name = await page.evaluate('(element) => element.textContent', title_obj)
                # 由于网站的时间 千奇百怪 有的在td 有的在p 有的在div  所有还是不要写死了
                date_obj = await li.querySelector(website.title_date_query)
                title_date = await page.evaluate('(element) => element.textContent', date_obj)
                # 开一个新的对象
                detail_page = await browser.newPage()
                # 访问详情页
                await detail_page.goto(url=str(title_url))
                # 拿到源码
                await detail_page.content()
                # 拿到 详情页的selector 对象
                element = await detail_page.querySelector(website.content_query)
                # 拿到详情页
                content_html = await detail_page.evaluate('(element) => element.outerHTML', element)
                print(title_url, title_name, title_date, len(content_html))
                await detail_page.close()
            except Exception as e:
                print(e)
        print(f"第{now_page}页访问>>>>>")
        # 点击下一页
        next_page_link = website.next_page_query

        if next_page_link:
            await page.click(next_page_link)
        else:
            raise Exception("already Crawl complete Exit coming soon....")

        await asyncio.sleep(2)

    # return item_list

async def page_close(browser):
    for _page in await browser.pages():
        await _page.close()
    await browser.close()

if __name__ == '__main__':
    Websites = namedtuple('websites', ['url', 'list_query', 'title_date_query', 'content_query', 'next_page_query'])

    websites = [
        (
            'http://www.cqzbtb.cn/_jiaoyixinxi/',
            '.listbox ul',
            '.ys',
            '.article-wrap',
            "body > section > div > div.list-wrap.row > div.listpa > ul > li:nth-child(7)"
        ),

    ]
    for i in websites:
        website = Websites._make(i)

        a = main()
        loop = asyncio.get_event_loop()
        results = loop.run_until_complete(asyncio.gather(a))

免费评分

参与人数 21吾爱币 +19 热心值 +17 收起 理由
57711 + 1 + 1 谢谢@Thanks!
hubohang + 1 我很赞同!
xiugou + 1 热心回复!
amurozhang + 1 我很赞同!
siryiio + 1 + 1 谢谢@Thanks!
xiaojizhang + 1 谢谢@Thanks!
kilo2580 + 1 + 1 谢谢@Thanks!
buerdaojun + 1 我很赞同!
xuming0315 + 1 用心讨论,共获提升!
menoooooos + 1 + 1 我很赞同!
MAOSKE + 1 谢谢@Thanks!
0vers1eep + 1 谢谢@Thanks!
lingwushexi + 1 谢谢@Thanks!
DAIDI + 1 + 1 谢谢@Thanks!
yjn866y + 1 + 1 谢谢@Thanks!
XiaoBai.Q.Q + 1 学习下
Bob5230 + 1 谢谢@Thanks!
苏紫方璇 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
LQ789 + 1 + 1 谢谢@Thanks!
laonanhai0812 + 1 谢谢@Thanks!
blindcat + 1 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| hybpjx 发表于 2023-11-13 09:46
Forgone 发表于 2023-11-12 22:58
爬虫方面想咨询一下大家,如果网站做了前后端分离处理,该怎么爬取呢?

不一样的吗。就爬json啊
xuri422 发表于 2023-4-24 08:19
试了一下很多网站都不行的
raise PageError('No node found for selector: ' + selector)
pyppeteer.errors.PageError: No node found for selector: body > section > div > div.list-wrap.row > div.listpa > ul > li:nth-child(7)
ivanchen1984 发表于 2023-4-21 16:51
wsnffg 发表于 2023-4-21 16:59
这个厉害了
Desyunyan 发表于 2023-4-21 17:37
学习一下,感谢分享
chen110 发表于 2023-4-22 01:30
谢谢分享,学习了
LQ789 发表于 2023-4-22 11:33
先收藏再学习~谢谢
evahappy 发表于 2023-4-22 17:40
这个得学习下,我这边总是做一次性的。这种通用的 需要学习
Bob5230 发表于 2023-4-23 00:10
感谢分享!
bdywbhyw 发表于 2023-4-23 08:00
学习了,先存留,下次试一试
xq2581 发表于 2023-4-23 09:02
看不懂    看不懂   
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-5-3 09:12

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表