声明:(我是个小白,学习爬虫也不久,此文章就是为了和大家沟通交流经验,非商业目的,也没有批量获取数据的意思🙏,没ip代理,没scrapy框架)没批量测试,这只是css验证的其中一个
相信很多玩爬虫的朋友,去浪评论网站的时候,大部分想到的无非就是【猫眼】、【豆瓣】、【猫途鹰】还有比较刁钻的【大众点评】
为什么说这个大众点评刁钻呢,来,先看看图吧
评论区内容是什么鬼?
之后的步骤就不用说了,百度,google,结果没一个能用的(可能都是往年的版本)
发现一个道理,有时候还是自己研究比较好,别人的不一定能用
好吧,现在我们开始分析
打开网页随便找一个全部评论
比如:http://www.dianping.com/shop/131662807/review_all
F12 开始搞事情,找到一个评论中用svg现实的内容“云”,class 是 na49a
位置 是这样的
.na49a {
background: -406.0px -1527.0px;
}
background-image 是这样的
open in new tab 打开svg文件.png
svg看到的是这样的.png
一开始我也是很懵的,我在想至于吗😂,我就是个小白啊
后来想了想还蛮有挑战性的呢就做吧,废话不对说了开始!
1.我们首先吧background 第一个数字和第二个看作x ,y
云.png
background: -406.0px -1527.0px;
2.来到 svg字体页面找到对映的子‘云’
3.看x和y值哪个和这个标签里面的比较相似,发现自己模拟的y是1527,svg的是1550,差23(其实我也不知道为什么是23,我猜是行高,反正对了😂),再试几个,发现没错 这就取到行号了
4.该看x坐标了,自己模拟的是406,发现svg里面没有对应的,于是网上搜索,发现是根据字体大小算的,发现字体大小是
font-size: 14px;
so 算法就是406/14 = 29 (index再加1 就是第30个字)
好了解析步骤就这么多,上代码,不许眨眼睛!!!
(我是把这些解析文件 都保存本地的,所以open打开的,如果想动态的话可以这段code自己改改),
必须要改的地方
1.cookie(网站上登录之后,f12,network,找Cookie)
2.request_svg_css()方法的文件路径,内容是网站的...svg.css文件
(svg_css.html).png
3.get_avg_font()方法的文件路径,内容是网站的...svg.svg文件
(svg_font.html).png
import re
import requests
from bs4 import BeautifulSoup
class Start(object):
def __init__(self, obj):
self.headers = {
'referer': 'http://www.dianping.com/shop/131662807',
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',
'Cookie': 此处请填写自己的cookie!
}
def main(self):
req = requests.get(
'http://www.dianping.com/shop/131662807/review_all'
, headers=self.headers)
soup = BeautifulSoup(req.text, 'html5lib')
# text = open(
# '/Users/hayashishihime/Documents/PycharmProjects/outsourcing_object/大众点评-评论/comments_page.html').read()
# soup = BeautifulSoup(text, 'html5lib')
for inx, li in enumerate(soup.select('div.reviews-items > ul > li')):
user_name = li.select('.name')[0].get_text(strip=True)
user_h_img = li.select('.dper-photo-aside >img')[0].get('src')
scores = [score.get_text(strip=True) for score in li.select('.score>.item')]
time = li.select('.time')[0].get_text(strip=True)
shop = li.select('.shop')[0].get_text(strip=True)
try:
last_review_words = \
re.findall(r'<div class="review-words Hide">([\s\S]*?)<div class="less-words">', str(li))[0]
except IndexError:
last_review_words = \
re.findall(r'<div class="review-words">([\s\S]*?)</div>', str(li))[0]
print(50 * '-', inx + 1, user_name, '-' * 50)
review_words = re.sub(r'<svgmtsi class="(.+?)"></svgmtsi>', self.request_svg_css,
last_review_words).replace(' ', '')
print(user_name)
print(user_h_img)
print(scores)
print(time)
print(shop)
print(review_words)
@存储可以写在这,我用的mongo 很方便
def request_svg_css(self, css_tag):
f = open('/Users/hayashishihime/Documents/PycharmProjects/outsourcing_object/大众点评-评论/svg_css.html', 'r').read()
css_tag_c = re.findall(
r'' + re.findall(r'<svgmtsi class="(.+?)"></svgmtsi>', str(css_tag))[
0] + r'{background:-(\d+).0px -(\d+).0px;}', f)
return self.get_avg_font(css_tag_c[0][0], css_tag_c[0][1])
def get_avg_font(self, x, y):
f = open('/Users/hayashishihime/Documents/PycharmProjects/outsourcing_object/大众点评-评论/svg_font.html', 'r').read()
new_x = int((int(x) / 14))
new_y = int(y) + 23
font_list = re.findall(r'y="' + str(new_y) + '">(.+?)</text>', f)
try:
font = font_list[0][new_x:new_x + 1]
except IndexError:
font = ''
return font
if __name__ == '__main__':
start = Start('')
start.main()
这是结果
mongo数据插入这块就不讲了有些页面可能会用到别的svg,可以把open写成直接获取网站svg和css 动态文件,此处不赘述了
网友评论