爬虫学习经验分享-------某点评网站

article/2025/10/30 8:56:46

        某点评网站爬虫分享----0基础学习,解决反爬,加密,ip代理,封ip“403 Forbidden”等问题。

        最近有个调查的项目,其中包含了对于网络数据的爬取。而之前我并没学过网络爬虫,因此我也抱着学习的心态来学习如何爬取某点评网站的评论。

        首先由于零基础,我先去搜索了相关视频学习爬虫的基本参数和方法,了解了requests库和beautifulsoup的基本用法。

        随后我就开始实战,学习某点评怎么爬取,但我 requests请求网址的时候怎么都无法成功,因此查阅资料后我才明白要请求头部加上一些信息,包括cookies,UA以及等等如下图所示:

        将这些参数加入到headers里面:

        终于可以请求成功了,但请求的数据一看评论内容有加密,因此我只能再去搜索资料,最终通过以下博客学习到了如何爬取评论,这里谢谢大佬先。

解决某网站css加密改进说明_丸丸丸子w的博客-CSDN博客取名最新是因为确实目前是最新的,三个月后会去掉最新找了很多博客代码都过时了,而且不是很好懂以前是字体库,现在是css加密,其反爬机制确实强本篇主要是对这篇博客的补充说明建议先食用这篇,大概懂了原理,出bug时再来看我这篇本篇主要是对原博客三个报错的说明改进。https://blog.csdn.net/weixin_57345774/article/details/127574631

         然后经历了两天的代码修改和测试,终于可以开始了,然后爬到一半又失败了,之前失误没有用ip代理,检测到我了,给我ip封了,于是出现了“403 Forbidden”。

        再稍做调整之后,我就去学习如何爬虫进行ip代理,在忙忙碌碌半天后,发现好的代理好贵,而没钱的我所幸找到了一种方法,免费ip代理池——“ProxyPool”,通过以下博客的学习,我开启了ip代理。

python爬虫添加代理ip池ProxyPool (Windows)_阿言Eric的博客-CSDN博客先说一下主要的流程:下载代理ip池文件Proxypool,然后安装代理池要用到的一些扩展库和数据库Redis,启动Redis服务之后,启动ProxyPool服务,然后在python中使用ProxyPool代理ip池。1、下载代理ip池代码:用的是github上比较火的ProxyPool,下载zip文件https://github.com/jhao104/proxy_pool/releases2、解压并安装代理池需要的依赖文件:解压后,cmd命令行进入到该文件夹下(在文件夹地址栏输入cmdhttps://blog.csdn.net/qq_34442867/article/details/110817267

        开启ip代理之后,测试什么的都很轻松通过,但开始爬取评论就寄了。 emmmm可能这些免费的ip代理爬这个网站太困难了吧,10个ip里面有10个都用不了。哎。。。。

        随后我发现家里另一台电脑的仍然可以正常访问,我就在想这两个电脑ip在同一个网段要封一起封啊,难不成他不是根据公网ip封的。因此我修改电脑的ip和之前不同,结果还是不行。。。。。。

        突然我想到难不成他封我更具的不是ip而是cookies,因为cookies会携带某些会话层参数。于是我把另一台电脑的cookies复制过来,发现诶的确可以,成功。因此他是根据cookies进行的封锁,这个时候就简单了,我们把浏览器的cookies清除就ok了,如下图所示。 

        以上问题克服完,我就开始了评论爬取,中间还有部分挫折,但都是小问题了,相信大家也可以自己慢慢克服,冲冲冲。

        以下附上我的爬虫代码:

import requests
import re
from lxml import etree
import pandas as pd
import time
from bs4 import BeautifulSoup
import randomdef crew(i, headers, web, last_page):"""爬取第i页的评论:return: 第i页评论的表格"""response = requests.get(web + f'/review_all/p{i}', headers=headers)svg = ''with open('01 网页数据_加密.html', mode='w', encoding='utf-8') as f:f.write(response.text)# 求出加密方式soup = BeautifulSoup(response.text, 'html.parser')svg = soup.find('svgmtsi')['class'][0]svgmtsi = soup.find_all('svgmtsi', limit=10)for svgm in svgmtsi:svg_temp = ''for i in range(len(svg)):if svg[i] == svgm['class'][0][i]:svg_temp += svg[i]else:breaksvg = svg_temp# 获取css文件请求svg内容css_url = 'http:' + \re.findall(r'<link rel="stylesheet" type="text/css" href="(//s3plus.meituan.*?)">', response.text)[0]css_response = requests.get(css_url)with open('02 css样式.css', mode='w', encoding='utf-8') as f:f.write(css_response.text)# 获取svg映射表svg_url = 'http:' + \re.findall(r'svgmtsi\[class\^="' + svg + r'"\].*?background-image: url\((.*?)\);', css_response.text)[0]svg_response = requests.get(svg_url)with open('03 svg映射表.svg', mode='w', encoding='utf-8') as f:f.write(svg_response.text)# 获取svg加密字典import parselwith open('03 svg映射表.svg', mode='r', encoding='utf-8') as f:svg_html = f.read()sel = parsel.Selector(svg_html)texts = sel.css('text')lines = []for text in texts:lines.append([int(text.css('text::attr(y)').get()), text.css('text::text').get()])# paths = sel.css("path")# texts = sel.css('textPath')# lines = []# for path, textPath in zip(paths, texts):#     lines.append([int("".join(re.findall("M0 (.*?) H600", path.css('path::attr(d)').get()))),#                   textPath.css('textPath::text').get()])with open('02 css样式.css', mode='r', encoding='utf-8') as f:css_text = f.read()class_map = re.findall(r'\.(' + svg + r'\w+)\{background:-(\d+)\.0px -(\d+)\.0px;\}', css_text)class_map = [(cls_name, int(x), int(y)) for cls_name, x, y in class_map]d_map = {}# 获取类名与汉字的对应关系for one_char in class_map:try:cls_name, x, y = one_charfor line in lines:if line[0] < y:passelse:index = int(x / 14)char = line[1][index]#                 print(cls_name,char)d_map[cls_name] = charbreakexcept Exception as e:print(e)# 替换svg加密字体,还原评论with open('01 网页数据_加密.html', mode='r', encoding='utf-8') as f:html = f.read()for key, value in d_map.items():html = html.replace('<svgmtsi class="' + key + '"></svgmtsi>', value)with open('04 网页数据.html', mode='w', encoding='utf-8') as f:f.write(html)# 去除空格,并存到dataframe中# e = etree.HTML(html)# pl = e.xpath("//div[@class='review-words Hide']/text()")# 获取信息soup = BeautifulSoup(html, 'html.parser')for e in soup.find_all('div', class_="less-words"):e.extract()reviews_items = soup.find('div', class_="reviews-items")if last_page == 0:lastpages = soup.find_all('a', class_='PageLink')for lastpage in lastpages:last_page = int(lastpage['title'])if lastpages == []:last_page = 1reviews = reviews_items.find_all('li', class_=None)pl = []for review in reviews:try:comment = review.find('div', class_="review-words Hide").get_text()except:comment = review.find('div', class_="review-words").get_text()star = review.find('div', class_="review-rank").find('span')['class'][1]time = review.find('span', class_="time").get_text()fabulous = review.find('em', class_='col-exp')if fabulous == None:fabulous = '(0)'else:fabulous = fabulous.get_text()pl.append((comment, star, time, fabulous))# comments = soup.find_all('div', class_="review-words Hide")# pl = []# for comment in comments:#     pl.append(comment.get_text())dq_list = []cc_df = pd.DataFrame()for p in pl:if p[0] == '\n\t                    ' or p[0] == '\n                            ':passelse:dq_list.append(p)for pp in dq_list:# cc_df = cc_df.append({'评论': pp}, ignore_index=True)temp = pd.DataFrame({'评论': pp[0], '星级': pp[1], '时间': pp[2], '赞数': pp[3]}, index=[0])cc_df = pd.concat([cc_df, temp], ignore_index=True)return cc_df, last_pagedef get_web(i, url, headers, key_words, tag_word):webs = []resp = requests.get(url + f'/p{i}', headers=headers)soup = BeautifulSoup(resp.text, 'html.parser')items = (soup.find('div', class_="shop-list J_shop-list shop-all-list").find_all('li'))for item in items:link = item.find('div', class_='txt').find('div', class_='tit').find('a')tag = item.find('span', class_='tag').get_text()comment_have = item.find('a', class_="review-num")istopTrade = item.find('span', class_="istopTrade")if istopTrade != None:if istopTrade.get_text() == '(尚未营业)':continueif comment_have == None:continueflag_tag = Falsefor tag_w in tag_word:if tag_w in tag:flag_tag = Truebreakif flag_tag == False:continuefor word in key_words:if word in link['title']:webs.append((link['title'], link['href']))breakreturn websdef add_workbook():with open("out.csv", "ab") as f:f.write(open("new_out.csv", "rb").read())return None# ip代理地址池用的函数
# def get_proxy():
#     # 5000:settings中设置的监听端口,不是Redis服务的端口
#     return requests.get("http://127.0.0.1:5010/get/").json()
# def delete_proxy(proxy):
#     requests.get("http://127.0.0.1:5010/delete/?proxy={}".format(proxy))if __name__ == '__main__':# 用自己的headers、Cookies、UACookies = []UA = []# 爬虫读取每一个店家网址getweb = Falseif getweb:webs = []start = 1  # 默认第一遍从第2页开始end = 40  # 默认爬取200页for i in range(start, end + 1):url = 'https://www.dianping.com/search/keyword/8/0_%E9%9C%B2%E8%90%A5'# 用自己的headers、Cookies、UAheaders = {}temp_web = get_web(i, url, headers, ['营'], ['采摘', '拓展', '游', '融'])for web in temp_web:if web not in webs:webs.append(web)time.sleep(10)print(f'第{i}页店家获取成功')with open(r'00 店家网址.txt', 'w', encoding='utf-8') as f:for web in webs:f.write(str(web[0]) + ':' + str(web[1]) + '\n')# 读取txt获取网址webs = []with open(r'00 店家网址.txt', 'r', encoding='utf-8') as f:web = f.readline().rstrip().split(':')if web != ['']:webs.append(web)while web != ['']:web = f.readline().rstrip().split(':')if web != ['']:webs.append(web)with pd.ExcelWriter('评论汇总.xlsx', mode='a', engine="openpyxl") as writer:for web_all in webs:# 设置开始页数和终止界面start_page = 1  # 默认第一遍从第2页开始end_page = 300  # 默认爬取200页last_page = 0df1 = pd.DataFrame()# 开始爬虫try:for i in range(start_page, end_page + 1):# 设置访问头部和页面web = web_all[1]# 用自己的headers、Cookies、UACookies = []headers = {}df2, last_page = crew(i, headers, web, last_page)df1 = pd.concat([df1, df2], axis=0, ignore_index=True)time.sleep(10 + random.randint(1, 10))print(web_all[0] + f"----第{i}页爬取成功" + f"----总共页数{last_page}")# 存入exceldf1.reset_index(inplace=True)df1.to_excel(writer, sheet_name=web_all[0], index=False)print(web_all[0] + f"----最终页数{end_page}")except:# 存入excelif last_page != i - 1 or i - 1 == 0:print(web_all[0] + ':爬虫失败中断')with open(r'05 中断爬取点位.txt', 'w', encoding='utf-8') as f1:f1.write(str(web_all[0]) + ':' + str(web_all[1]) + '\n')breakelse:df1.reset_index(inplace=True)df1.to_excel(writer, sheet_name=web_all[0], index=False)print(web_all[0] + f"----最终页数{i - 1}")


http://chatgpt.dhexx.cn/article/af0PxSNX.shtml

相关文章

前端学习总结,经验分享,项目经验分享过程

前言 来&#xff0c;和魔王哪吒总结一下&#xff0c;分享一下自己对前端学习总结&#xff0c;经验分享&#xff0c;以及写过的项目经验分享过程。 如果觉得还不错的话&#xff0c;浏览的过程中&#xff0c;需要您&#xff1a; 点赞&#xff0c;分享&#xff0c;评论有钱的捧…

方法教程:一分钟把网易云音乐上的MV/mv视频下载到本地电脑

1、用Google Chrome浏览器把网易云上的MV打开。点击【分享】-【复制链接】-粘贴到浏览器地址栏打开&#xff1a; 2、在视频旁边的空白处右击鼠标&#xff0c;打开【检查】&#xff1a; 3、打开界面后点击【Network】–【All】&#xff0c;然后刷新浏览器&#xff0c;让视频播放…

网易云 计算机,网易云音乐电脑版2.7.4.198336_网易云音乐 - 系统之家

网易云音乐是一款播放、发现高品质音乐的专业音乐播放器&#xff0c;能找到许多小众的品位音乐、歌手&#xff0c;让你在电脑上听CD品质的音乐。网易云音乐是网易旗下主推的音乐播放器&#xff0c;依托专业音乐人、DJ、好友推荐及社交功能&#xff0c;为用户打造全新的音乐生活…

利用requests爬取网易云音乐榜单并下载

最近想爬取网易云音乐的歌单&#xff0c;发现网上很多教程都用Selenium&#xff0c;比较麻烦。因为研究网易云音乐排行榜html码源&#xff0c;发现榜单是iframe动态加载的。用原网址爬取是爬取不到内容的。想用requests爬取的话需要获取iframe的源码。 目录 一、url和请求头分…

JS逆向之网易云音乐

文章目录 1. 目标网站2. 初步分析3. 定位加密参数生成位置4. 编码测试4.1 定义AES加密方法4.2 调用两次AES加密获取params4.3 获取歌曲的url4.4 单曲下载初步测试代码4.5 飙升榜单音乐批量抓取文章内容仅用于学习和技术交流,如有侵权请联系我删除。 1. 目标网站 https://musi…

网易云音乐 For Mac

网易云音乐mac版专门为mac电脑用户使用的音乐播放软件&#xff0c;用户还可以使用网易云账号将电脑和手机上的音乐同步网易云音乐mac版中&#xff0c;使用更加方便。网易云音乐for mac比较人性化&#xff0c;它能根据你平时听音乐的喜好&#xff0c;自动给你推荐音乐&#xff0…

利用 Python 一键下载网易云音乐 10W+ 乐库

如果你常听音乐的话&#xff0c;肯定绕不开网易云&#xff0c;作为一款有情怀的音乐 App&#xff0c;我对网易云也是喜爱有加。虽然说现在都已经是 5G 时代了&#xff0c;大家的手机流量都绰绰有余&#xff0c;但在线播放还是不如本地存着音乐文件靠谱&#xff0c;今天我们就用…

网易云音乐虚化图片html,网易云音乐怎么换背景 背景图片设置方法

网易云音乐作为主流的手机音乐播放器&#xff0c;依托强大的社交功能&#xff0c;从众多播放器中脱颖而出&#xff0c;个性化的皮肤更是为它增加了不少魅力&#xff0c;下面就跟小编了解下具体的设置方法吧。 类别&#xff1a;影音播放 大小&#xff1a;90.81M 语言&#…

JAVA如何用URL下载网易云音乐

1.打开网易云&#xff0c;选择一首歌曲播放&#xff0c;然后按f12 2.找到并点击以.m4a结尾的链接 3.把输入框的链接替换代码里面的URL //1.获取资源地址URL url new URL("https://m801.music.126.net/20201006161345/802c3e2bd0240db619e27a7f1eeffcce/jdyyaac/5608/005a…

使用云函数快速升级网易云音乐等级

关于等级特权&#xff0c;网易云官网有介绍 https://music.163.com/#/level/details &#xff0c;最高级Lv10有100G音乐云盘免费容量 使用分享的脚本是每天自动在网易云音乐刷完300首歌&#xff0c;让你的账号快速升级&#xff08;等级数据每天下午2点更新&#xff09; 一个…

网易云linux版本如何安装包,网易云音乐Linux版提供64位和32位ubuntu16.04安装包

网易云音乐终于推出了官方Linux版本&#xff0c;提供的下载安装包有&#xff1a; deepin15(32位)&#xff1a;http://s1.music.126.net/download/pc/netease-cloud-music_0.9.0_i386.deb deepin15(64位)&#xff1a;http://s1.music.126.net/download/pc/netease-cloud-music_0…

干货,下载网易云课堂和B站的视频

原文网址&#xff1a;https://www.jianshu.com/p/ad20e5a63353 我们在平时的学习中&#xff0c;很有可能会接触 网易云课堂 和 BIlibili 这两个很棒的网站。 有的时候我们在线观看不方便&#xff0c;总是想把网站里面的视频下载到电脑&#xff0c;然后自己闲暇时间进行学习。 方…

EasyRecovery帮你一招找回网易云下载的单曲

科技迅速发展的时代里,人们越来越离不开手机、电脑、平板等电子产品,也更习惯于把重要的音频、视频和图片储存在这些电子产品中了。既然有储存,那就有丢失,大家一定遇到过因误删文件而抓狂的情况吧。不过如今处理误删的情况也完全是小事啦,所谓一物降一物,我们有文件恢复…

网易云API接口运行教程

1.网易云api下载地址&#xff1a; https://neteasecloudmusicapi.js.org/#/ 2.下载或者git clone到本地 3.解压缩NeteaseCloudMusicApi-master.zip 4.在搜索框中输入cmd打开终端&#xff0c;在终端中输入node app.js&#xff0c;服务器已经运行&#xff0c;可以将生成地址输入到…

HC05蓝牙模块(主从一体)简单使用

使用 按住蓝牙模块上的按键&#xff0c;再接通电源&#xff0c;进入AT指令模式&#xff0c;可以进行AT指令设置 引脚连接 PA2&#xff08;TX&#xff09; -RX PA3&#xff08;RX&#xff09; -TX 5V VCC GND …

蓝牙模块—HC-05调试

每次拿到蓝牙模块进行调试时&#xff0c;都会忘记一些细节等信息。因此为了将来能够顺利地调试蓝牙模块&#xff0c;以本文来记录一下调试过程。 调试所需的硬件有HC-05蓝牙模块&#xff0c;USB转TTL模块&#xff0c;杜邦线若干。 首先用杜邦线将HC05与USB转TTL模块正确连接&am…

【蓝牙模块】三款常用的基础蓝牙模块,HC05,JDY-31,CC2541介绍与测试说明

文章目录 一. HC05二.JDY-311.介绍2.测试 二.CC2541 一. HC05 HC05与其他两款的区别是&#xff0c;需要按住RST键进入AT指令模式 一. 上电进入AT模式方法 先按住HC05蓝牙模块上面的RST按键&#xff0c;再给蓝牙模块通电。蓝牙模块上面的LED进入慢闪模式(约1秒钟闪烁一次)&a…

ATK-HC05蓝牙模块的详细说明

前段时间买了个ATK的HC05蓝牙模块。HC05模块是一款高性能主从一体蓝牙串口模块&#xff0c;可以不用知道太多蓝牙相关知识就可以很好的上手。说白了&#xff0c;只是个蓝牙转串口的设备&#xff0c;你只要知道串口怎么编程使用&#xff0c;就可以了&#xff0c; 实现了所谓的透…

Arduino使用HC05蓝牙模块与手机连接

通过本文&#xff0c;可以了解到以下内容&#xff1a; 进入 AT 模式进行蓝牙基本参数设置Arduino 蓝牙控制 LED 电路设计以及代码编写利用 Andorid 蓝牙串口调试软件测试功能 进入 At 模式进行蓝牙基本参数设置 想要使用 Arduino 的蓝牙模块&#xff0c;首先要对蓝牙模块进行…

HC05和电脑蓝牙通讯

通常情况下都是将HC05和HC04进行主从配对&#xff0c;然后进行通讯。如果手边没有HC04其实可以使用笔记本自带的蓝牙和HC05进行通讯。 配置方法如下&#xff1a; 将HC05配置为主机模式将电脑和HC05的保存连接删除。 单击下方更多蓝牙设置&#xff0c;进行蓝牙串口的配置。 添…