爬虫puppeteer-马蜂窝列表 热门数据爬取 demo(一)

本文介绍了一种利用Puppeteer和Cheerio进行网页自动化抓取的技术方案,通过定时任务定期抓取指定网站的数据,并使用SQL将抓取到的信息存储到本地数据库中。该方案结合了前端爬虫技术和数据库操作,实现了数据的自动化采集与存储。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

技术点:

一,使用了puppeteer 基本的API

二,使用了cheerio 处理页面数据

三,使用了连接本地数据库,用到sql插入

四,使用了node的包 定时器 node-schedule

 

以下是页面代码:

// 'use strict';

const puppeteer = require('puppeteer');

const cheerio = require('cheerio');

const {addHotListSql} = require('./src/hot/connectSql.js');

const fs = require('fs');

const schedule = require('node-schedule');

// 定时任务

let rule = new schedule.RecurrenceRule();

  rule.dayOfWeek = [0, new schedule.Range(1, 6)];

  rule.hour = 11;

  rule.minute = 0;

let j = schedule.scheduleJob(rule, function(){

getList()

  });

 

// 等待3000毫秒

const sleep = time => new Promise(resolve => {

setTimeout(resolve, time);

})

 

// 获取列表信息

getList()

 

// 目标页面

const pageUrl = 'http://www.mafengwo.cn/';

function getList(){

(async () => {

try {

const browser = await puppeteer.launch({

ignoreHTTPSErrors: true,

headless: false,

args: ['--no-sandbox', '--disable-setuid-sandbox'],

}).catch(() => browser.close);

const page = await browser.newPage();

await page.goto(pageUrl);

try {

let pageNums = await page.$eval('.count', el => {

let str = el.innerHTML

return str;

});

pageNums = parseInt(pageNums.substring(1))

for(let count = 0 ; count < pageNums; count++){

await sleep(3000)

let thList = await page.$eval('.tn-list', el => {

let str = el.innerHTML

return str;

});

// count ++

console.log('-------------------------------------------- start')

console.log('页面页码:', count);

console.log('采集状态:', '成功');

await getListData(thList)

if (count < pageNums) {

await page.click('.pg-next._j_pageitem')

} else {

console.log(' the last one')

await page.click('.pi:nth-child(8)')

}

console.log('-------------------------------------------- end')

}

} catch (error) {

console.log('-------------------------------------------- start')

console.log('采集状态:', '失败');

console.log('错误信息:', error)

console.log('-------------------------------------------- end')

}

await sleep(3000)

await browser.close();

} catch (e) {

console.log(e);

}

})()

}

// 获取列表信息

function getListData(html) {

let $=cheerio.load(html);

let itemList = $('.tn-item')

let hotList = []

for (let i = 0; i < itemList.length; i++) {

let item = {};

item.coverUrl = $(itemList[i]).find('.tn-image img').attr('src')

item.jumpUrl = $(itemList[i]).find('.tn-image a').attr('href')

item.id = parseInt(item.jumpUrl.substring(3)) // 列表ID 作为唯一标识

item.title = $(itemList[i]).find('.tn-wrapper dl dt a').text() 

item.subtitle = $(itemList[i]).find('.tn-wrapper dl dd a').text() 

item.position = $(itemList[i]).find('.tn-extra .tn-place a').text() 

item.avatarUrl = $(itemList[i]).find('.tn-extra .tn-user a img').attr('src') // itemList[i].children[1].children[1].children[2].children[0].children[0].src

item.nickName = $(itemList[i]).find('.tn-extra .tn-user a').text().trim() // itemList[i].children[1].children[1].children[2].children[0].innerText.trim()

item.viewNums = $(itemList[i]).find('.tn-extra .tn-nums').text() // itemList[i].children[1].children[1].children[3].innerText

addHotListSql(item)

// hotList.push(item)

}

}

 

### 使用 Python 进行马蜂窝旅游网景点评论数据的网络爬虫抓取 #### 准备工作 为了实现这目标,首先需要导入必要的库。这些库包括 `requests` 和 `re`,前者用于发送 HTTP 请求,后者则是 Python 的正则表达式模块,有助于在字符串中查找特定模式[^4]。 ```python import re import requests ``` #### 获取评论内容 URL 定义要访问的目标页面链接,该链接指向包含所需评论信息的具体 API 接口。此接口通常会接受参数如 POI ID (Point of Interest Identifier),即兴趣点编号,用来指定想要查询哪个地点的相关评价。 ```python comment_url = 'https://pagelet.mafengwo.cn/poi/pagelet/poiCommentListApi' ``` 注意实际应用时应替换为最新的有效API路径,并确保遵循网站的服务条款与隐私政策规定。 #### 构建请求头和参数字典 构建个合理的 headers 字典模拟浏览器行为,同时准备 params 参数传递给服务器端以获取正确的响应结果。这里假设 poi_id 已知并设置了个具体的值作为例子展示: ```python headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)", } params = {"poi_id": "7391903"} ``` #### 发送 GET 请求并解析 JSON 数据 通过调用 `requests.get()` 方法向上述地址发起请求,传入已配置好的头部信息及参数列表。成功接收到回复后将其转换成易于操作的形式——JSON 对象,以便进步提取有用的信息片段。 ```python response = requests.get(comment_url, headers=headers, params=params) data = response.json() comments = data['data']['list'] for item in comments: print(item['content']) ``` 这段代码将会遍历返回的结果集中的每个条目,并打印出每条评论的实际文本部分。 考虑到现代Web应用程序广泛采用异步加载技术(AJAX),直接利用静态HTML文档可能无法满足需求。对于这种情况下的动态网页内容采集任务,则可以考虑使用 Selenium 或 Puppeteer 等工具来进行自动化控制浏览器的行为完成整个过程[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值