文本挖掘(四万字总结篇:爬虫 - 文本预处理 - 高频词统计 - 聚类 - 情感分析)

2023-11-19

1 爬虫

1.1 爬虫原理

这部分内容可以跳过,掌握与否对后面内容的阅读影响并不大,但有兴趣的话可以看看呐~

  实现一个爬虫,一般需要经过两个步骤:处理请求解析源码/数据

  处理请求方面,我们可以使用Python程序自动发送请求,然后根据返回的网页脚本,判断该页面是服务器端渲染还是浏览器端渲染。服务器端渲染可以直接获取到源码并进行解析,如果是浏览器端渲染则需要获取浏览器向服务器发送的二次请求得到的数据。其中,服务器端渲染的网页需要我们解析源码,而浏览器端渲染的网页一般可以直接获得数据。

  • 服务器端渲染:右键 - 查看页面源代码,如果在源码中能看到页面中字条的内容,则认为该字条是服务端渲染的。

  • 浏览器端渲染:右键 - 检查,分别点击网络、Fetch/XHR,当搜索框获得焦点的时候,我们可以看到浏览器会向服务器发送一个请求,然后将服务器返回的数据渲染后到页面上,这种方式就是浏览器端渲染,也被称为AJAX技术。
    在这里插入图片描述

  对于浏览器端渲染的页面,我们直接获取二次请求得到的数据即可,而对于服务器端渲染的页面,我们需要从源码解析出有价值的内容。我们可以使用Python的第三方模块re、bs4、xpath等。re是使用正则表达式匹配网页源码,从而得到我们想要的内容;bs4是通过标签和属性定位网页源码中我们需要的内容的位置,其更符合前端的编程习惯;xpath同样是通过标签和属性定位,但它看起来更加直观。

  • re
import re

list = re.findall(r"\d+", "我的电话号码是:10086, 我女朋友的电话号码是:10010")  # ['10086', '10010']
  • bs4
from bs4 import BeautifulSoup

page = BeautifulSoup(res, "html.parser")  # 把页面源代码(res)交给BeautifulSoup进行处理, 生成BeautifulSoup对象
table = page.find("table", attrs={"class": "hq_table"})  # 找到table
  • xpath
# xpath是在XML文档中搜索内容的一门语言,html是xml的一个子集
from lxml import etree

xml = 
"""
<book>
    <id>1</id>
    <name>野花遍地香</name>
    <price>1.23</price>
    <author>
        <nick>周大强</nick>
        <nick>周芷若</nick>
    </author>
</book>
"""
tree = etree.XML(xml)
result = tree.xpath("/book/name/text()")  # ['野花遍地香']。/表示层级关系,第一个/是根节点,text() 拿文本

  另外,在处理请求的过程中,可能需要解决一系列的反爬措施(1)防止网站识别Python程序需要加上User-Agent请求头(2)对于使用cookie验证登录的网站需要带上登录后服务器返回的cookie作为请求头(3)防止因频繁的请求导致ip地址被封需要使用代理(4)以及针对浏览器端渲染的情况,直接请求数据时可能遇到的一系列加密手段,这时候获取数据需要模拟加密过程进行解密……

  个人理解的爬虫原理~

1.2 实现一个爬虫

  一般来说,平台知名度越大,其反爬措施就越多,这时候获取数据也会变得更加困难,而下文将会介绍一种技巧性的方法。

1.2.1 Selenium

  Selenium是一个用于Web应用程序测试的工具,它可以直接运行在浏览器中,模拟用户的操作,例如点击、输入、关闭、拖动滑块等,就像真正的用户在操作一样。通过Selenium我们可以直接定位到页面中某段文字的位置,在已经经过浏览器渲染的网页中获取需要的内容,而不需要关心网页是服务器端渲染还是浏览器端渲染,所见即所得。

1.2.2 超级鹰

  另一方面,某些数据可能需要登录网站后才能获取,而在登录选项中选择账号密码登录一般会被要求输入验证码,比如常见的数字、汉字验证码等,某东平台使用的是滑块。我们可以使用超级鹰处理滑块,它是一款成熟的验证码处理工具,其使用原理是通过截取浏览器中验证码的图片传到超级鹰工具接口,然后接口会返回识别出来的数据(数字,汉字,坐标等),我们通过Selenium可以直接操作浏览器从而通过验证。

1.2.3 实现一个爬虫(源码在这里~)
  • 在这之前,大家可以先注册一个超级鹰账号哈,1元=1000题分,识别一次只需不到50题分,还是相当良心的。
  • 其次,在1.1 爬虫原理部分有简单介绍过xpath,这里有一种更便捷的方法获取元素的xpath,就像这样:右键-检查
  • 另外,部分商品可以使用id搜索
  • 再有就是,Selenium是需要配合浏览器驱动使用的,Chrome的驱动:chromedriver,对应浏览器版本的驱动下载完成后,将驱动放置在Python的安装目录,像下面这样:(也许还需要配置环境变量??如果遇到报错说没有找到浏览器驱动的话,可以自行搜一下具体是怎么配置的哈)

chaojiying.py(验证码处理)

#!/usr/bin/env python
# coding:utf-8

import requests
from hashlib import md5

class Chaojiying_Client(object):

    def __init__(self, username, password, soft_id):
        self.username = username
        password =  password.encode('utf8')
        self.password = md5(password).hexdigest()
        self.soft_id = soft_id
        self.base_params = {
            'user': self.username,
            'pass2': self.password,
            'softid': self.soft_id,
        }
        self.headers = {
            'Connection': 'Keep-Alive',
            'User-Agent': 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)',
        }

    def PostPic(self, im, codetype):
        """
        im: 图片字节
        codetype: 题目类型 参考 http://www.chaojiying.com/price.html
        """
        params = {
            'codetype': codetype,
        }
        params.update(self.base_params)
        files = {'userfile': ('ccc.jpg', im)}
        r = requests.post('http://upload.chaojiying.net/Upload/Processing.php', data=params, files=files, headers=self.headers)
        return r.json()

    def ReportError(self, im_id):
        """
        im_id:报错题目的图片ID
        """
        params = {
            'id': im_id,
        }
        params.update(self.base_params)
        r = requests.post('http://upload.chaojiying.net/Upload/ReportError.php', data=params, headers=self.headers)
        return r.json()


# if __name__ == '__main__':
    # 用户中心>>软件ID
    # chaojiying = Chaojiying_Client('超级鹰账号', '密码', '软件ID')
    # 本地图片文件路径替换code.png,有时WIN系统须要//
    # im = open('code.png', 'rb').read()  # im就是图片的所有字节
    # 官方网站>>价格体系
    # print(chaojiying.PostPic(im, 9101))  # 9101验证码类型

jd.py - 爬虫主程序

目标链接:(第24行代码)

在这里插入图片描述

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys
from chaojiying import Chaojiying_Client
import time

# 初始化超级鹰
chaojiying = Chaojiying_Client('******', '********', '******')  # 替换自己的账号、密码和软件ID

# 无头浏览器
# opt = Options()
# opt.add_argument("--headless")
# opt.add_argument("--disbale-gpu")
# options = opt

# 设置不关闭浏览器
option = webdriver.ChromeOptions()
option.add_experimental_option("detach", True)

web = webdriver.Chrome(options = option)

# 打开登录页面
web.get("")  # 填入某东登录页面链接,由于不能出现具体的目标链接,故以截图显示
# 最大化窗口,防止误触
web.maximize_window()

# time.sleep()是为了等待资源加载完
time.sleep(3)
# 使用账号登录
web.find_element(By.XPATH, '//*[@id="content"]/div[2]/div[1]/div/div[3]/a').click()

time.sleep(3)
# 输入用户名和密码
web.find_element(By.XPATH, '//*[@id="loginname"]').send_keys("***********")  # 某东账号
web.find_element(By.XPATH, '//*[@id="nloginpwd"]').send_keys("********")  # 某东密码
# 点击登录
web.find_element(By.XPATH, '//*[@id="loginsubmit"]').click()

time.sleep(3)
# 处理验证码,识别图像
verify_img = web.find_element(By.XPATH, '//*[@id="JDJRV-wrap-loginsubmit"]/div/div/div/div[1]/div[2]/div[1]/img')
dic = chaojiying.PostPic(verify_img.screenshot_as_png, 9101)
result = dic['pic_str']  # x1,y1
p_temp = result.split(",")
x = int(p_temp[0])

# 滑动滑块
btn = web.find_element(By.XPATH, '//*[@id="JDJRV-wrap-loginsubmit"]/div/div/div/div[2]/div[3]')
ActionChains(web).drag_and_drop_by_offset(btn, x, 0).perform()

time.sleep(8)
# 登陆成功,搜索界面(使用id搜索)
web.find_element(By.XPATH, '//*[@id="key"]').send_keys("100010935292", Keys.ENTER)

# time.sleep(5)
# # 点击商品
# web.find_element(By.XPATH, '//*[@id="J_goodsList"]/ul/li[1]/div/div[1]/a/img').click()

# time.sleep(5)
# # 移动到新窗口
# web.switch_to.window(web.window_handles[-1])

time.sleep(5)
# 商品属性
web.find_element(By.XPATH, '//*[@id="choose-attr-1"]/div[2]/div[1]/a').click()

time.sleep(5)
# 点击(商品评论)
comment_el = web.find_element(By.XPATH,'//*[@id="detail"]/div[1]/ul/li[5]')
comment_el.click()

time.sleep(5)
# 点击(只看当前商品评价)
only_el = web.find_element(By.XPATH, '//*[@id="comment"]/div[2]/div[2]/div[1]/ul/li[9]/label')
webdriver.ActionChains(web).move_to_element(only_el ).click(only_el ).perform()

f = open("comments.txt", mode="w", encoding='utf-8')

time.sleep(5)
# 评论列表
for i in range(100):
  # 每一页的评论
  div_list = web.find_elements(By.XPATH,'//*[@id="comment-0"]/div[@class="comment-item"]')  

  for div in div_list:
    comment = div.find_element(By.TAG_NAME, 'p').text
    f.write(comment + '\n\n')
    # 打印页数
    print(i)

  if i < 99:
    # 下一页 
    next_el = web.find_element(By.XPATH, '//*[@id="comment-0"]/div[12]/div/div/a[@class="ui-pager-next"]')
    # 防止元素遮挡 
    webdriver.ActionChains(web).move_to_element(next_el ).click(next_el ).perform()

  time.sleep(3)

f.close()
print('over!')

  • chaojiying.pyjd.py放在同一个目录下,然后下载相关依赖包,运行jd.py就ok了,再放个视频趴(懒得剪了
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

文本挖掘(四万字总结篇:爬虫 - 文本预处理 - 高频词统计 - 聚类 - 情感分析) 的相关文章

  • 1600*B. pSort(并查集)

    解析 并查集 将能够交换的位置相连 查看对应的位置能够交换 include
  • 面试题: Vue中的 computed 和 watch的区别

    computed computed看上去是方法 但是实际上是计算属性 它会根据你所依赖的数据动态显示新的计算结果 计算结果会被缓存 computed的值在getter执行后是会缓存的 只有在它依赖的属性值改变之后 下一次获取computed
  • 巧用 ChatGPT,让开发者的学习和工作更轻松

    引言 随着人工智能技术的快速发展和广泛应用 ChatGPT 作为一种新兴的自然语言处理模型 近期备受瞩目 引发了广泛讨论 ChatGPT 具有多种应用场景 既可以用作聊天机器人 实现智能问答和自然语言交互 也可以作为文本生成工具 帮助人们撰

随机推荐

  • html5中如何去掉input type date默认样式

    html5中如何去掉input type date默认样式 1 时间选择的种类 HTML代码 选择日期
  • 【初探DETR】安装环境

    windows下 需要环境 cython git https github com cocodataset cocoapi git subdirectory PythonAPI egg pycocotools torch gt 1 5 0
  • C# 实例详解委托之Func、Action、delegate(精品)

    概述 委托是 NET编程的精髓之一 在日常编程中经常用到 在C 中实现委托主要有Func Action delegate三种方式 本节主要就这三种委托的用法通过实例展开讲解 Func用法解析 Func Func是带返回值的委托 原型函数如下
  • 软件测试技术(性能与自动化测试)

    一 实验原理 1 功能与自动化测试 功能自动化测试是指使用自动化工具和脚本来模拟用户操作 验证软件应用程序的各种功能是否按照预期工作的过程 在进行功能自动化测试时 测试人员通常编写脚本 这些脚本可以模拟用户在应用程序中进行的各种操作 例如点
  • 【机器学习】12、主题模型

    文章目录 一 pLSA 二 LDA模型 一 pLSA 每个文档都会在主题上有一个分布 每个主题在各个词上也有一个分布 p w j
  • React中使用if else 条件判断

    在react中用jsx渲染dom的时候经常会遇到if条件判断 然而在jsx中竟是不允许if条件判断的 以下有几种判断方式 可以根据自己的应用场景 挑选适合的 方案一 class HelloMessage extends React Comp
  • QTableWidget获取选中的内容及所在行数

    QTableWidget选中所有单元格及取消选中所有单元格 ui gt allowSelectKeyTableWidget gt selectAll ui gt allowSelectKeyTableWidget gt setFocus i
  • 使用 Blender* 重新拓扑 VR 和游戏素材

    本文介绍如何将网格重新拓扑成一个整洁的低密度模型 然后 UV 解包该网格 以便将纹理贴添加至新模型 本文还将探讨如何使用免费工具 比如 Blender 及其 Bsurface 插件 重新拓扑雕塑的 3D 网格 查看详情
  • bootstrap3 表单构建器_如何快速构建基于MES的开源云平台

    导读本文为2019工业互联网平台活动盘点文章 同时也欢迎广大工业互联网平台企业参与本次盘点 具体参与方式可加编辑微信号 13517202453 详细咨询 随着智能制造转型战略的持续推进 MES作为承载智能化生产制造过程的核心系统正在受到越来
  • 正则表达式语法大全

    前言 一般开发中都会接触到正则表达式 作为一名合格的前端 也应该了解一下正则表达式编写原则 便于自己也能快速编写想要的正则表达式 1 作用 正则表达式是一种字符串匹配的模式 数据验证 比如电话号码 邮箱等 替换文本 快速找到特定文本 用于替
  • lua秒级睡眠和毫秒级睡眠(sleep, msleep)

    秒级睡眠 for linux cygwin or mingw function sleep n os execute sleep tonumber n end for windows function sleep n os execute
  • Transaction rolled back because it has been marked as rollback-only解决

    项目中遇到Transaction rolled back because it has been marked as rollback only错误 不要想 就是遇到了事物嵌套 即使你把所有方法上的 Transactional注解全部删除
  • cookie 设置中文

    在使用Django的时候需要将中文用户名写入cookie中 但是cookie的编码不支持中文 写入就会 UnicodeEncodeError latin 1 codec can t encode characters in position
  • 更好的在小学语课上用计算机,论多媒体技术在小学语文教学中的作用

    论多媒体技术在小学语文教学中的优势 作者 孖无悔观教育 论文格式范文 摘要 多媒体教学相比于传统的 黑板加粉笔 式的传统教学更具有优势 多媒体教学在小学语文课堂中的应用犹如清风活水 给教育注入了新的活力 它不但可以优化课堂结构 而且也让我们
  • java 匿名内部类简介说明

    转自 java 匿名内部类简介说明 下文笔者讲述Java匿名内部类的简介说明 如下所示 匿名内部类的简介 匿名内部类 未显式指定类名的内部类称之为 匿名内部类 匿名内部类创建 匿名类是不能有名称的类 所以没办法引用它们 须在创建时 作为ne
  • 关于element UI 中输入框禁止输入空格的实现

    关于element UI 中输入框禁止输入空格的实现 在项目开发过程中会遇到输入框禁止输入空格或者特殊字符之类的需求 其中禁止输入空格的实现方法如下所示 1 使用vue框架中的 trim修饰符
  • Python基础教程(crossin全60课)

    Python 第 第 1 1 课 安装 4 Python 第 第 2 2 课 print 5 Python 第 第 3 3 课 IDE
  • Flutter踩坑笔记一——环境搭建的坑

    Flutter的环境搭建其实还是很简单的 当你把AndroidStudio升级安装3 5版本的时候 他已经默认为你安装了Dart和Flutter插件 可见Google对flutter的重视 所以也省了我们不少事儿 首先 打开 官方文档 获取
  • mysql数据库中user表字段详解

    描述 MySQL的user表是MySQL服务器的内置表 它用于存储MySQL服务器上的用户信息 包括用户名 密码 主机名和权限等 它用于控制MySQL服务器上的访问权限 以确保服务器的安全性 表结构 CREATE TABLE user Ho
  • 文本挖掘(四万字总结篇:爬虫 - 文本预处理 - 高频词统计 - 聚类 - 情感分析)

    1 爬虫 1 1 爬虫原理 这部分内容可以跳过 掌握与否对后面内容的阅读影响并不大 但有兴趣的话可以看看呐 实现一个爬虫 一般需要经过两个步骤 处理请求和解析源码 数据 处理请求方面 我们可以使用Python程序自动发送请求 然后根据返回的