## DianpingCrawler
爬取大众点评
爬取的难度在于获取坐标偏移的文字字典,页面中的部分文字标签是靠js依照坐标解析svg文件获得文字。
##更新爬虫项目2019-6-18
大众点评的前端dom结构更变。导致之前的代码不能够继续适用。
如`http://www.dianping.com/shop/4122621/review_all/p3`中的所有的评论的类标签都变成review。中间隐藏的文字`应该`是16进制,暂时没有进行解密。类似:
```
<svgmtsi class="review"></svgmtsi>
<svgmtsi class="review"></svgmtsi>
"的"
<svgmtsi class="review"></svgmtsi>
<svgmtsi class="review"></svgmtsi>
```
在之前的爬取项目中,我们采取获取网站css中的标签,然后与svg图片进行解析组合成字典库。评论中的class中的属性对应字典库中的信息。这样便能将所有的评论爬取。
![](https://raw.githubusercontent.com/Hatcat123/GraphicBed/master/Img/20190619165133.png)
### 新的思路方法
我们不选择绕过最近字库加密的方式。仍然选择原来的爬取方式,生成一个字典库,然后将评论的属性与字典库中的文字匹配。
通过发现解析网页的html发现不能只接对评论网站,返回结果内容如上面代码,class内容全部隐藏。
我们选择使用回应链接`http://www.dianping.com/review/551096310`,发现这里的评论竟然还是原来的解析方式。通过评论隐藏内容的属性的class的区别。()
这样我们就仍然可以使用过去的思想来进行修改。迭代新爬虫。
### 爬取方法
爬取的过程中需要我们在登录的情况下才能查看更多的评论,所以我们需要在浏览器中进行登录,获取登录后的cookie。
输入待爬取的目标的网站,内部解析网站中所有评论的详细评论链接、解析本次爬取过程的字典库需要两个条件,字库所对应的坐标与字典的svg矢量图的位置。然后对网站评论隐藏内容于字典库中的数据替换。解析所需要构造的内容如:头像、用户、标签、评论内容、图片、评分等。然后保存到txt或者其他,如有需要清洗成word格式。
**0x01、解析评论链接**
传入cookie并且设置好headers后进行爬取与解析评论回应链接。根据页面中是否有下一页来决定是否终止爬虫。
```
def _get_review_conment_page(self): # 获得评论内容
"""
请求评论页,并将<span></span>样式替换成文字
"""
while self._cur_request_url:
print('[{now_time}] {msg}'.format(now_time=datetime.datetime.now(), msg=self._cur_request_url))
res = requests.get(self._cur_request_url, headers=self._default_headers, cookies=self._cookies)
html = res.text
review_link = re.findall(r'><ahref="//(.*?)"target="_blank"class="reply"',
html.replace(' ', '').replace('\n', ''))
del (review_link[0])
first_url = re.findall('ing.com/review/(.*?)', review_link[0])
review_link.extend(first_url) # 将评论列表加入到总队列中
self.review_links.extend(review_link)
doc = etree.HTML(html)
try:
self._default_headers['Referer'] = self._cur_request_url
next_page_url = 'http://www.dianping.com' + doc.xpath('.//a[@class="NextPage"]/@href')[0]
except IndexError:
next_page_url = None
self._cur_request_url = next_page_url
```
**0x02、构造字典库**
这一步是比较麻烦的一个过程,只能点到为止,具体内容还需要你仔细观察代码。
首先我们通过F12找到对应的评论中的隐藏的字,然后根据class的属性就能找到索要加载的css与svg。我们发现一个文字有对应的一个标签,且相同的字体拥有同样的标签。这样就好办了。找到对应的文字,大概3-5个不同标签。记录下对应的标签-css中坐标位置-svg中文字的xy坐标位置。
css文件内容样例:`.owfmjw{background:-154.0px -2201.0px;}`
```
.owfmjw{background:-154.0px -2201.0px;}.owfe1r{background:-364.0px -1420.0px;}.owfxo6{background:-14.0px -1455.0px;}.owfy4m{background:-266.0px -2019.0px;}.owfjg4{background:-392.0px -1532.0px;}.occsi7{background:-92.0px -60.0px;}.owffde{background:-448.0px -622.0px;}.owf3mq{background:-462.0px -1924.0px;}.owfka1{background:-350.0px -2114.0px;}.owfvy8{background:-308.0px -62.0px;}.owfel7{background:-224.0px -622.0px;}.owf37y{background:-14.0px -373.0px;}.owfl4g{background:-560.0px -2333.0px;}.owflht{background:-112.0px -1306.0px;}.owfjrf{background:-574.0px -662.0px;}.owfidj{background:-210.0px -1847.0px;}.owfzvj{background:-448.0px -1420.0px;}.occfbp{background:-442.0px -60.0px;}.owfb9e{background:-224.0px -1217.0px;}.owfaug{background:-322.0px -1171.0px;}.owfjcj{background:-560.0px -1498.0px;}.owfmw6{background:-532.0px -1348.0px;}.owfurs{background:-154.0px -373.0px;}.owfgsd{background:-154.0px -2163.0px;}.owftup{background:-392.0px -2163.0px;}.owfz1d{background:-322.0px -2243.0px;}.owfvmg{background:-546.0px -1878.0px;}.owfpau{background:-42.0px -1217.0px;}.owfmdm{background:-434.0px -798.0px;}.owfvxu{background:-532.0px -842.0px;}.owf76l{background:-196.0px -415.0px;}.owf0gi{background:-28.0px -195.0px;}.owfda1{background:-462.0px -284.0px;}.owfchs{background:-434.0px -1171.0px;}.owfw6z{background:-518.0px -327.0px;}.owfqqf{background:-196.0px -955.0px;}.owfq1l{background:-126.0px -912.0px;}.owfs36{background:-476.0px -62.0px;}.owfe0y{background:-42.0px -2333.0px;}.owfw6o{background:-490.0px -2163.0px;}.owf75m{background:-532.0px
```
svg内容样例`<text x="0" y="46">历分爆</text>`
```
<text x="0" y="46">历分爆锅父碰茅恐寸矮异唐险乓绢梢菊装罗拘欲则悲鹊北奉慕袄限洞都凶千密暮达快容糖秧澡私</text>
<text x="0" y="85">扔品惕倦南观只死夺刊浑糠扭康淡蛛妄冶夫捡喷脚情项遵发滋铜灌锣垫盲极歉事讲腰押穿果或廉</text>
<text x="0" y="129">趁鼓鸽幼翅脖尼畅抽遗绸删被海乞肺识垄素湾齐室梦姑善朗皮乒助摄办长令胜炼搂陡漫场浪般价</text>
<text x="0" y="169">兔朱肝朽踪骡弓帝人腐津代典志解责博建酬阳出技必诗救窑摘堤扁峰焰虏孩骑御愉爸敌阀顿仇于</text>
<text x="0" y="218">挂遍等纷壮隶非猾匹会载岸萄置缎姜星龙珍深许构违势医夹首卜汁把嘱顶拿痛翁狱样枝销疑崇泻</text>
<text x="0" y="259">伞追困到惜系伍奔贸野云蛇炮虫童供内猜忍轿沙布执挑如得呀境祸岗饮又乡灿搜扣脂遇中乙迈缺</text>
<text x="0" y="307">沟勺瓶毛岂宙汉奏愈返们姿化普压连宾货截您唇璃兰雨染墨恢棕植灰垮茶右敞为太杰隙香雹将呆</text>
<text x="0" y="350">稳柄劳督仰股轧扎崖我悼影饱专药给职逮剃耽骗拳尘提摧践瑞谈饺杨渔占孝亭林娃晃鄙临央催箱</text>
```
一般找到3-5个文字就能猜出了文字库的规律。
```
def _get_font_dict_by_offset(self, url):
"""
获取坐标偏移的文字字典, 会有最少两种形式的svg文件(目前只遇到两种)
"""
res = requests.get(url, timeout=60)
html = res.text
font_dict = {}
y_list = re.findall(r'd="M0 (\d+?) ', html)
if y_list:
font_list = re.findall(r'<textPath .*?>(.*?)<', html)
for i, string in enumerate(font_list):
y_offset = self.start_y - int(y_list[i])
sub_font_dict = {}
for j, font in enumerate(string):
x_offset = -j * self.font_size
sub_font_dict[x_offset] = font
font_dict[y_offset] = sub_font_dict
else:
font_list = re.findall(r'<text.*?y="(.*?)">(.*?)<', html)
for y, string in font_list:
y_offset = self.start_y - int(y)
sub_font_dict = {}
for j, font in enumerate(string):
x_offset = -j * self.font_size
sub_font_dict[x_offset] = fon
没有合适的资源?快使用搜索试试~ 我知道了~
大众点评Crawler小案例.rar
共5个文件
py:3个
png:1个
md:1个
需积分: 1 0 下载量 129 浏览量
2024-01-26
09:40:18
上传
评论
收藏 56KB RAR 举报
温馨提示
Python 爬虫是指使用 Python 编程语言编写的用于自动化地从互联网上获取数据的程序。爬虫程序会模拟人类在浏览器中访问网页,通过解析HTML页面、提取数据和进行相应的处理,将所需的数据爬取下来。 Python 爬虫的优点如下: 1. 简单易学:Python 语言具有简洁明了的语法和丰富的第三方库支持,使得编写爬虫代码变得简单易学。 2. 强大的第三方库:Python 拥有强大的第三方库,如 Requests、BeautifulSoup、Scrapy 等,这些库可以帮助开发者高效地处理网页请求、解析HTML、提取数据等操作。 3. 广泛的应用领域:Python 爬虫不仅适用于网页数据的抓取,还可以用于搜索引擎的索引和分析、数据挖掘、机器学习等领域。 4. 可扩展性:Python 爬虫可以通过调用其他语言编写的库或工具来实现更复杂的功能。此外,Python 提供了良好的接口和协议支持,可以与其他系统或平台进行无缝集成。 5. 高效快速:Python 爬虫利用多线程、异步IO等技术可以并发地处理多个网页请求,提高爬取效率。 6. 社区支持和文档丰富:Python 拥有庞
资源推荐
资源详情
资源评论
收起资源包目录
大众点评Crawler.rar (5个子文件)
DianpingCrawler
dazhong.py 8KB
readme.md 11KB
clear_data.py 2KB
capth.png 47KB
demo.py 1KB
共 5 条
- 1
资源评论
百锦再@新空间代码工作室
- 粉丝: 1w+
- 资源: 806
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功