• 分享个pyppeteer 通用爬虫


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

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

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

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

    1. # -*- coding: utf-8 -*-
    2. # home.php?mod=space&uid=238618 : 2022/8/19 13:17
    3. # home.php?mod=space&uid=686208 : lzc
    4. # home.php?mod=space&uid=621973 : hybpjx@163.com
    5. # home.php?mod=space&uid=267492 : __init__.py
    6. # @Software: PyCharm
    7. import asyncio
    8. from pyppeteer import launch
    9. from collections import namedtuple
    10. def screen_size():
    11. """使用tkinter获取屏幕大小"""
    12. # 导入gui编程的模块
    13. import tkinter
    14. # 创建一个空间界面
    15. tk = tkinter.Tk()
    16. # 获得宽高
    17. width = tk.winfo_screenwidth()
    18. height = tk.winfo_screenheight()
    19. tk.quit()
    20. # 得到返回值
    21. return width, height
    22. async def main():
    23. # 默认无头浏览器 沙盒模式
    24. browser = await launch({'headless': False, 'args': ['--no-sandbox'], })
    25. # 新开一个page对象
    26. page = await browser.newPage()
    27. # 拿到一个尺寸 作为你的谷歌浏览器大小
    28. width, height = screen_size()
    29. # 也可以自定义
    30. await page.setViewport(viewport={"width": width, "height": height})
    31. # 开启js
    32. await page.setJavaScriptEnabled(enabled=True)
    33. # 设置请求头
    34. await page.setUserAgent(
    35. 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 '
    36. '(KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/16.16299'
    37. )
    38. # 开启 隐藏 是selenium 让网站检测不到
    39. await page.evaluate('''() =>{ Object.defineProperties(navigator,{ webdriver:{ get: () => false } }) }''')
    40. # 访问url
    41. await page.goto(website.url)
    42. now_page = 0
    43. while True:
    44. now_page += 1
    45. # 滑动js 动态加载
    46. await page.evaluate('window.scrollBy(0, document.body.scrollHeight)')
    47. # 优雅的等待1秒 不会造成 资源阻塞
    48. await asyncio.sleep(1)
    49. # xpath
    50. li_list = await page.querySelectorAll(website.list_query)
    51. # 可将返回值返回到列表中 可省略
    52. # item_list = []
    53. for li in li_list:
    54. # 防止有些网站 第一条数据获取不到 第二条数据获取的到 故加个try
    55. try:
    56. # 找寻下面所有的a标签 详情页链接地址
    57. title_obj = await li.querySelector("a ")
    58. # 找到 其 链接地址和链接标题
    59. title_url = await page.evaluate('(element) => element.href', title_obj)
    60. title_name = await page.evaluate('(element) => element.textContent', title_obj)
    61. # 由于网站的时间 千奇百怪 有的在td 有的在p 有的在div 所有还是不要写死了
    62. date_obj = await li.querySelector(website.title_date_query)
    63. title_date = await page.evaluate('(element) => element.textContent', date_obj)
    64. # 开一个新的对象
    65. detail_page = await browser.newPage()
    66. # 访问详情页
    67. await detail_page.goto(url=str(title_url))
    68. # 拿到源码
    69. await detail_page.content()
    70. # 拿到 详情页的selector 对象
    71. element = await detail_page.querySelector(website.content_query)
    72. # 拿到详情页
    73. content_html = await detail_page.evaluate('(element) => element.outerHTML', element)
    74. print(title_url, title_name, title_date, len(content_html))
    75. await detail_page.close()
    76. except Exception as e:
    77. print(e)
    78. print(f"第{now_page}页访问>>>>>")
    79. # 点击下一页
    80. next_page_link = website.next_page_query
    81. if next_page_link:
    82. await page.click(next_page_link)
    83. else:
    84. raise Exception("already Crawl complete Exit coming soon....")
    85. await asyncio.sleep(2)
    86. # return item_list
    87. async def page_close(browser):
    88. for _page in await browser.pages():
    89. await _page.close()
    90. await browser.close()
    91. if __name__ == '__main__':
    92. Websites = namedtuple('websites', ['url', 'list_query', 'title_date_query', 'content_query', 'next_page_query'])
    93. websites = [
    94. (
    95. 'http://www.cqzbtb.cn/_jiaoyixinxi/',
    96. '.listbox ul',
    97. '.ys',
    98. '.article-wrap',
    99. "body > section > div > div.list-wrap.row > div.listpa > ul > li:nth-child(7)"
    100. ),
    101. ]
    102. for i in websites:
    103. website = Websites._make(i)
    104. a = main()
    105. loop = asyncio.get_event_loop()
    106. results = loop.run_until_complete(asyncio.gather(a))

  • 相关阅读:
    C++类和对象【中】
    气传导耳机什么意思?备受好评的气传导耳机推荐
    tomcat敏感数据加密实现方案
    025 - STM32学习笔记 - 液晶屏控制(二) - 代码实现
    论文浅尝 | ChatKBQA:基于微调大语言模型的知识图谱问答框架
    JS常用的函数
    【java】26:JUnit
    Lua基础
    【后端框架】MyBatis(3)
    GPT-4V:AI在教育领域的应用
  • 原文地址:https://blog.csdn.net/leavemyleave/article/details/134366217