首页 > 其他分享 >pyppeteer爬虫

pyppeteer爬虫

时间:2023-04-21 10:55:47浏览次数:35  
标签:node await url pyppeteer 爬虫 detail tab data

import logging
from os.path import exists
from os import makedirs
import json
import asyncio
from pyppeteer import launch
from pyppeteer.errors import TimeoutError

logging.basicConfig(level=logging.INFO,
                    format='%(asctime)s - %(levelname)s: %(message)s')

INDEX_URL = 'https://dynamic2.scrape.cuiqingcai.com/page/{page}'
TIMEOUT = 10
TOTAL_PAGE = 10
RESULTS_DIR = 'results'
WINDOW_WIDTH, WINDOW_HEIGHT = 1366, 768

exists(RESULTS_DIR) or makedirs(RESULTS_DIR)

browser, tab = None, None
HEADLESS = False


async def init():
    global browser, tab
    browser = await launch(headless=HEADLESS,
                           args=['--disable-infobars', f'--window-size={WINDOW_WIDTH},{WINDOW_HEIGHT}'])
    tab = await browser.newPage()
    await tab.setViewport({'width': WINDOW_WIDTH, 'height': WINDOW_HEIGHT})


async def scrape_page(url, selector):
    http://logging.info('scraping %s', url)
    try:
        await tab.goto(url)
        await tab.waitForSelector(selector, options={
            'timeout': TIMEOUT * 1000
        })
    except TimeoutError:
        logging.error('error occurred while scraping %s', url, exc_info=True)


async def scrape_index(page):
    url = INDEX_URL.format(page=page)
    await scrape_page(url, '.item .name')


async def parse_index():
    return await tab.querySelectorAllEval('.item .name', 'nodes => nodes.map(node => node.href)')


async def scrape_detail(url):
    await scrape_page(url, 'h2')


async def parse_detail():
    url = tab.url
    name = await tab.querySelectorEval('h2', 'node => node.innerText')
    categories = await tab.querySelectorAllEval('.categories button span', 'nodes => nodes.map(node => node.innerText)')
    cover = await tab.querySelectorEval('.cover', 'node => node.src')
    score = await tab.querySelectorEval('.score', 'node => node.innerText')
    drama = await tab.querySelectorEval('.drama p', 'node => node.innerText')
    return {
        'url': url,
        'name': name,
        'categories': categories,
        'cover': cover,
        'score': score,
        'drama': drama
    }


async def save_data(data):
    name = data.get('name')
    data_path = f'{RESULTS_DIR}/{name}.json'
    json.dump(data, open(data_path, 'w', encoding='utf-8'), ensure_ascii=False, indent=2)


async def main():
    await init()
    try:
        for page in range(1, TOTAL_PAGE + 1):
            await scrape_index(page)
            detail_urls = await parse_index()
            for detail_url in detail_urls:
                await scrape_detail(detail_url)
                detail_data = await parse_detail()
                http://logging.info('data %s', detail_data)
                await save_data(detail_data)
    finally:
        await browser.close()


if __name__ == '__main__':
    asyncio.get_event_loop().run_until_complete(main())

*****有可能会报错

解决方案:----

标签:node,await,url,pyppeteer,爬虫,detail,tab,data
From: https://www.cnblogs.com/q-q56731526/p/17339559.html

相关文章

  • C# 爬虫 HttpClient 之 https 踩坑记录
    背景有一个网页(https),请求返回是一串json,可通过模拟浏览器获取,也可以通过api请求获取,其中通过C#的httpclient的Get发起请求,会出现不定时的返回结果乱码请求代码[HttpPost(Name="GetTestNoParams")]publicasyncTask<string>GetTestNoParams(stringurl){......
  • Python爬虫技术简介
    Python是一种广泛应用于网络爬虫的编程语言,它的简洁易读的语法、强大的数据处理能力和各种可用的第三方库,使得Python成为开发高效且功能强大的爬虫的首选语言。本篇博客将介绍Python爬虫的基础知识和一些常用的爬虫技术。一、Python爬虫技术介绍Python爬虫技术包括网页请求、HT......
  • 爬虫常用方法
    1.selenium转beautifulsoup:pageSource=driver.page_sourcesoup=BeautifulSoup(pageSource,'html.parser') 2.bs4查找页面内容:resultPages=soup.find(text=re.compile(u'查询失败,请重新查询!$'))print('resultPages:'+str(resultPages))......
  • 轻松应对同一IP被封禁的问题:HTTP代理对于爬虫的重要性
    在网络爬虫的世界里,遇到IP被封禁的问题是非常普遍的。不过,我们可以采取一些措施来应对这个问题,其中一个重要的措施就是使用HTTP代理。HTTP代理是一种能够隐藏真实IP地址并改变访问路径的技术,它可以将爬虫的请求发送到代理服务器中,再由代理服务器向目标服务器发起请求,从而避......
  • 从根源上解决反爬虫问题——HTTP代理的应用
    你是不是经常遇到在爬取网站数据时被封IP,或者访问速度过慢的情况呢?这就是因为网站为了保护自己的数据不被恶意利用,采取了反爬虫技术。但是,现在有一种解决方法——HTTP代理。HTTP代理可以将你的请求都转发到一个代理服务器上,然后由代理服务器再去访问目标网站。这样的好处在......
  • Day 25 25.1 Scrapy框架之全站爬虫(CrawlSpider)
    Scrapy框架之全站爬虫(CrawlSpider)在之前Scrapy的基本使用当中,spider如果要重新发送请求的话,就需要自己解析页面,然后发送请求。而CrawlSpider则可以通过设置url条件自动发送请求。LinkExtractorsCrawlSpider是Spider的一个派生类。CrawlSpider与spider不同......
  • Day 25 25.2 Scrapy框架之分布式爬虫(scrapy_redis)
    分布式爬虫(scrapy_redis)分布式爬虫是指将一个大型的爬虫任务分解成多个子任务,由多个爬虫进程或者多台机器同时执行的一种爬虫方式。在分布式爬虫中,每个爬虫进程或者机器都具有独立的爬取能力,可以独立地爬取指定的网页或者网站,然后将爬取到的数据进行汇总和处理。分布式爬......
  • 记录常用的爬虫代码段(长期更新)
    判断文件路径不存在创建文件路径ifnotosp.exists(path):os.makedirs(path)去除字符串非法字符,防止创建文件夹报错#去掉非法字符pitow=re.sub('[\/:*?"<>|]','-',name)......
  • pathon爬虫实战——爬取某网站的多页番剧内容
    (本博客只为技术分学习,无其他用途) 1.准备涉及的第三方库如下: 2.网页分析2.1检验网页1.运行浏览器,打开网页,按快捷键F12打开开发者工具,F5刷新页面2.在右侧点击Network,打开browser?sort=rank&page=1文件,可以看到各种信息,查看表头 3.获取Cooki和User-Agnet,准备伪......
  • 如何使用动态拨号代理提高网络爬虫成功率
    随着互联网的不断发展和数据的爆炸增长,越来越多的企业和个人开始使用网络爬虫来获取所需的数据。然而,在爬虫过程中,很容易被目标站点识别并拦截,导致数据抓取失败。为了解决这一问题,许多开发者开始使用动态拨号代理技术来提高网络爬虫的成功率。动态拨号代理是一种常用的技术......