前两个月真的是被项目搞得累的要死,没时间看书,没时间看剧,没时间玩游戏也没时间写东西。所以抓住这短暂的空隙写点东西记录一下。
因为项目需要大众点评的数据,所以我又掏出了我尘封已久的python,开始了爬虫之路。虽然对大众点评的反爬取机制做了心里准备,但是真正上手的时候才发现,我还是too naive。

遇到问题

1. 随便用request.get请求了一下返回403

这个问题小意思,加上UA又是一条好汉

2. 频繁请求被封IP

再次掏出我尘封已久的代理库,订单续个费,继续战斗

3. 遇到小boss


这两个字哪去了?被吃了?以前没见过这阵仗啊,去网上搜索了一下,原来是用svg进行了转换。解决方法使用了某位素未谋面大神的代码,我这里就不啰嗦了原文链接参见:
Python爬虫入门教程 65-100 爬虫与反爬虫的修罗场,点评网站,字体反爬之三 - 梦想橡皮擦 - 博客园

4. 再遇到大boss


这个跟上面的不一样啊, 这些都是个啥? 就在我将要放弃的时候,又找到了以为更牛逼大神的文章,请看:
https://lingmoumou.github.io/p/2019/05/15/839addd8/
虽然大神文章中很多图片挂了,但是无法改变我激动的心情!原来大众点评用了自己的字体文件,然后通过 这些unicode来对应字体文件中的字,果然厉害啊!

所以按照大神的思路和我自己的实践总结了几点方法:

  1. 先把大众点评自己的字体文件下载下来:
  2. 把下载下来的文件再上传到百度字体编辑器中 FontEditor 上传后的结果如下图

3.  也是很牛逼的一步,把这些字体图片截图保存,并使用ocr识别出文字! 因为下面的标识符太多了,所以我先编辑了一下页面的html,找到这个css类,加上display: none 就可以了  手动一页一页的截图: (截了7页)

然后下载一下百度ocr的sdk,写一段代码,来识别这些截图 百度AI开放平台-全球领先的人工智能服务平台-百度AI开放平台 代码如下:

from aip import AipOcr
import time

""" 你的 APPID AK SK  图2的内容"""
APP_ID = ''
API_KEY = ''
SECRET_KEY = ''

client = AipOcr(APP_ID, API_KEY, SECRET_KEY)
result_text = ''

for index in range(1,8):
    fname = 'images/' + str(index) + '.png'
    print(fname)

    """ 读取图片 """
    def get_file_content(filePath):
        with open(filePath, 'rb') as fp:
            return fp.read()

    image = get_file_content(fname)

    """ 调用通用文字识别, 图片参数为本地图片 """
    results = client.general(image)["words_result"]
    print(results)
    for result in results:
        result_text += result['words']

    time.sleep(1)


print(result_text)

最终生成字符串

1234567890店中美家馆小车大市公酒行国品发电金心业商司超生装园场食有新限天面工服海华水房饰城乐汽香部利子老艺花专东肉菜学福饭人百餐茶务通味所山区门药银农龙停尚安广鑫一容动南具源兴鲜记时机烤文康信果阳理锅宝达地儿衣特产西批坊州牛佳化五米修爱北养卖建材三会鸡室红站德王光名丽油院堂烧江社合星货型村自科快便日民國和活童明器烟育宾精屋经居庄石顺林尔县手厅销用好客火雅盛体旅之鞋辣作粉包楼校鱼平彩上吧保永万物教吃设医正造丰健点汤网庆技断洗料配汇木缘加麻联卫川泰色世方寓风幼羊烫来高厂兰阿贝皮全女拉成云维贸道术运都囗博河瑞宏京际路祥青镇厨培力惠连马鸿钢训影甲助窗布富牌头四多妆吉苑沙恒隆春干饼氏里二管诚制售嘉长轩杂副清计黄讯太鸭号街交与叉附近层旁对巷栋环省桥湖段乡厦府铺内侧元购前幢滨处向座下凤港开关景泉塘放昌线湾政步宁解白田町溪十八古双胜本单同九迎第台玉锦底后七斜期武岭松角纪朝峰六振珠局岗洲横边济井办汉代临弄团外塔杨铁浦字年岛陵原梅进荣友虹央桂沿事津凯莲丁秀柳集紫旗张谷的是不了很还个也这我就在以可到错没去过感次要比觉看得说常真们但最喜哈么别位能较境非为欢然他挺着价那意种想出员两推做排实分间甜度起满给热完格荐喝等其再几只现朋候样直而买于般豆量选奶打每评少算又因情找些份置适什蛋师气你姐棒试总定啊足级整带虾如态且尝主话强当更板知己无酸让人啦式笑赞片酱差像提队走嫩才刚午接重串回晚微周值费性桌拍跟块调糕

就可以用在上文提到大神的代码中了。

5. 收尾

终于可以痛痛快快的抓取了,最后抓取完,又学了一个新方法可以从monogodb导出到csv

./mongoexport --db dianping --collection shop --type=csv --fields name,shop_detail_url,star,comments,price,fuzzy_address,ad,group_count,region,page,page_index,brand_url --out ~/Documents/workspace/Dianping/dianping-hangzhou.csv

希望这个方法可以多坚持一段时间。。。