什么是爬虫?

爬虫,也称为网络爬虫或网络蜘蛛,是指一种自动化程序或脚本,用于在互联网上浏览和提取信息。爬虫模拟人类用户在网页上的行为,通过HTTP协议发送请求,获取网页内容,然后解析并提取感兴趣的数据

在使用爬虫时,需要遵守法律法规和网站的使用条款

  1. 网站的使用条款:每个网站都有自己的使用条款和隐私政策,这些规定了对网站内容和数据的访问和使用限制。在使用爬虫之前,务必仔细阅读并遵守网站的使用条款。
  2. 知识产权:爬虫可能涉及到对网站上的内容进行复制、提取或分发。在进行这些操作时,你应该尊重知识产权法律,包括版权和商标法。确保你有合法的权利使用、复制或分发所爬取的内容。
  3. 网络破坏和滥用:使用爬虫时,应避免对目标网站造成不必要的负载、干扰或破坏。不得以恶意方式使用爬虫,如进行DDoS攻击、破解安全措施或非法搜集个人信息。
  4. 数据隐私和个人信息保护:在爬取网站上的数据时,需特别注意处理个人身份信息和隐私数据的合规性。遵守适用的数据保护法律,确保合法地处理和存储用户数据。
  5. 欺诈和滥用:不得使用爬虫进行欺诈、仿冒、垃圾邮件或其他非法活动。尊重其他用户和网站的利益,遵守公平竞争原则

robots.txt规则

安装依赖

nodejs

npm install puppeteer #爬虫 | 自动化UI测试

Puppeteer是一个由Google开发和维护的Node.js库,它提供了一个高级的API,用于通过Headless Chrome或Chromium控制和自动化网页操作。它可以模拟用户在浏览器中的交互行为,例如点击、填写表单、截屏、生成PDF等,同时还能够获取网页的内容和执行JavaScript代码。

以下是Puppeteer的一些主要特性:

  1. 自动化浏览器操作:Puppeteer可以以无头模式运行Chrome或Chromium,实现对网页的自动化操作,包括加载页面、点击、表单填写、提交等。它还支持模拟用户行为,如鼠标移动、键盘输入等。
  2. 截图和生成PDF:Puppeteer可以对页面进行截图,保存为图像文件,也可以生成PDF文件。这对于生成网页快照、生成报告、进行页面测试等非常有用。
  3. 爬虫和数据抓取:Puppeteer可以帮助你编写网络爬虫和数据抓取脚本。你可以通过模拟用户行为来导航网页、提取内容、执行JavaScript代码,并将数据保存到本地或进行进一步的处理。
  4. 网页性能分析:Puppeteer提供了一些用于分析网页性能的API,例如测量页面加载时间、网络请求和资源使用情况等。这对于性能优化和监测非常有用。
  5. 无头模式与调试模式:Puppeteer可以在无头模式下运行,即在后台运行Chrome或Chromium,无需显示浏览器界面。此外,它还支持调试模式,允许你在开发过程中检查和调试页面。

python

pip install wordcloud #生成词云图
pip install jieba #正文分词
  1. WordCloud:
    WordCloud是一个用于生成词云的Python库。它可以根据给定的文本数据,根据词频生成一个美观的词云图像,其中词语的大小表示其在文本中的重要程度或频率。WordCloud库提供了丰富的配置选项,可以控制词云的外观、颜色、字体等属性。你可以根据需求定制词云的样式和布局。WordCloud还提供了一些方便的方法,用于从文本中提取关键词、过滤停用词等。你可以使用pip安装WordCloud库,并参考官方文档进行使用。
  2. jieba:
    jieba是一个开源的中文分词库,用于将中文文本切分成单个词语。中文分词是NLP(自然语言处理)中的一个重要任务,jieba库提供了一种有效且灵活的分词算法,可以在中文文本中准确地识别出词语边界。jieba支持三种分词模式:精确模式、全模式和搜索引擎模式。你可以根据需要选择适合的分词模式

代码案例

puppeteer 会自动打开浏览器点击你传入的参数,例如前端,它就会自动点击前端菜单,然后拿到推荐的数据,交给python,进行中文分词,分完词之后输出词云图

index.js

import puppeteer from 'puppeteer'
import { spawn } from 'child_process'
const btnText = process.argv[2]
const browser = await puppeteer.launch({
    headless: false,//取消无头模式
});
const page = await browser.newPage(); //打开一个页面
page.setViewport({ width: 1920, height: 1080 }); //设置页面宽高
await page.goto(''); //跳转到
await page.waitForSelector('.side-navigator-wrap'); //等待这个元素出现

const elements = await page.$$('.side-navigator-wrap .nav-item-wrap span') //获取menu下面的span

const articleList = []
const collectFunc = async () => {
   //获取列表的信息
    await page.waitForSelector('.entry-list')
    const elements = await page.$$('.entry-list .title-row a')
    for await (let el of elements) {
        const text = await el.getProperty('innerText')
        const name = await text.jsonValue()
        articleList.push(name)
    }
    console.log(articleList)
    //调用python脚本进行中文分词 输出词云图
    const pythonProcess = spawn('python', ['index.py', articleList.join(',')])
    pythonProcess.stdout.on('data', (data) => {
        console.log(data.toString())
    })
    pythonProcess.stderr.on('data', (data) => {
        console.log(data.toString())
    })
    pythonProcess.on('close', (code) => {
        console.log(`child process exited with code ${code}`)
    })
}

for await (let el of elements) {
    const text = await el.getProperty('innerText') //获取span的属性
    const name = await text.jsonValue() //获取内容
    if (name.trim() === (btnText || '前端')) {
        await el.click() //自动点击对应的菜单
        collectFunc() //调用函数
    }
}

index.py

import jieba #引入结巴库
from wordcloud import WordCloud #引入词云图
import matplotlib.pyplot as plt
import sys
text = sys.argv[1]
words = jieba.cut(text) #中文分词
#添加字体文件 随便找一个字体文件就行 不然不支持中文
font = './font.ttf'
info = WordCloud(font_path=font,width=1000,height=800,background_color='white').generate(''.join(words))

#输出词云图
plt.imshow(info,interpolation='bilinear')
plt.axis('off')
plt.show()

效果展示 (词云图)

Nodejs 第五十六章(爬虫)_词云