如果你也是看准了Python,想自学Python,在这里为大家准备了丰厚的免费学习大礼包,带大家一起学习,给大家剖析Python兼职、就业行情前景的这些事儿。
一、Python所有方向的学习路线
Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

二、学习软件
工欲善其必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。

三、全套PDF电子书
书籍的好处就在于权威和体系健全,刚开始学习的时候你可以只看视频或者听某个人讲课,但等你学完之后,你觉得你掌握了,这时候建议还是得去看一下书籍,看权威技术书籍也是每个程序员必经之路。

四、入门学习视频
我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。


四、实战案例
光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

五、面试资料
我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

成为一个Python程序员专家或许需要花费数年时间,但是打下坚实的基础只要几周就可以,如果你按照我提供的学习路线以及资料有意识地去实践,你就有很大可能成功!
最后祝你好运!!!
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
import urllib.request
from bs4 import BeautifulSoup
import re
from fontTools.ttLib import TTFont
import xlwt
过程中使用的部分软件:
-
正则表达式测试器
-
fontcreator
-
合适的OCR软件
记录操作步骤及代码如下所示:
1. 网页解析
1.1 爬取数据解析
选择餐饮店铺数量较多的上海万象城店,搜索结果界面如下:

-
每页显示15条数据,共10页内容
-
每条店铺信息包含内容如下:
店铺名称 | 是否提供团购/为分店/广告 |
星级、评分、评价人数、人均价格 | 口味、环境、服务 |
菜品种类、地址分区、详细地址 | |
推荐菜 | |
团购信息、优惠信息 |
1.2 网址解析
首页URL地址:http://www.dianping.com/search/keyword/1/10_%E4%B8%87%E8%B1%A1%E5%9F%8E](http://www.dianping.com/search/keyword/1/10_万象城)
第二页URL地址:http://www.dianping.com/search/keyword/1/10_%E4%B8%87%E8%B1%A1%E5%9F%8E/p2](http://www.dianping.com/search/keyword/1/10_万象城/p2)
第三页URL地址:http://www.dianping.com/search/keyword/1/10_%E4%B8%87%E8%B1%A1%E5%9F%8E/p3
建立循环:
for i in range(1,11)
baseURL = ‘http://www.dianping.com/search/keyword/1/10_%E4%B8%87%E8%B1%A1%E5%9F%8E/p’
URL = baseURL + str(i)
1.3 登陆处理
大众点评的网页翻页需要登陆。这里采用手机验证码的方式登陆,使用开发者工具提取cookie、User-Agent,打包为headers。

1.4 定义爬取函数askURL
def askURL(URL):
head = {“User-Agent”: “”, “cookie": “”}#保密原因,省略使用的User-Agent与Cookie
request = urllib.request.Request(URL, headers=head)
html = “”
html = urllib.request.urlopen(request).read().decode(‘utf-8’) #使用UTF-8解码
return (html)
2. 数据爬取与提取
2.1 数据爬取
循环调用askURL函数,爬取每页信息,储存在字符串变量html中
def getData(baseURL):
for i in range(1,10):
URL = baseURL + str(i)
html = askURL(URL)#html是askURL的返回结果,循环下的html记录单页的爬取结果,因此数据解析提取也需要在循环内进行
使用开发者工具读取源码,可以看到全部的店铺信息储存在ID为shop-list-all-list的div标签中,每个li标签为一条店铺记录。其中pic分类记录缩略图、txt分类记录店铺信息,svr-info记录团购信息
2.2 使用BeautifulSoup
方案1:提取多个标签,手动合并
soup = BeautifulSoup(html, “html.parser”)
soupfind = soup.find_all(‘div’, { ‘class’ :{“pic” , “txt” , “svr-info”}})#提取多个标签下信息时的处理方式,会提取为3个列表,需要手动合并为一个
#仅提取单个标签时的写法
soupfind = soup.find_all(‘div’, class_ :“txt” )
#合并过程(仅供参考)
soup_find = []
i = 0
while i < len(soupfind):
l = “”
l = str(soupfind[i]) + str(soupfind[i+1]) + str(soupfind[i+2])
soup_find.append(l)
i += 3
但后续操作中发现,部分店铺不含团购信息,导致”svr-info“class下面为空值,每三个合并出现错误
方案2:由于每个店铺的全部信息含在一个
- 标签下
-
def getData(baseURL):
for i in range(1, 11):
URL = baseURL + str(i)
html = askURL(URL)
soup = BeautifulSoup(html, “html.parser”)
soup_find = soup.find_all(‘li’, class_ = “”)
但这种方式会提取出一些非店铺的分支,会造成正则表达式搜索结构出现大量空值,带来混乱,关注到title与店铺信息间必然存在一一对应关系,后续将采用这一方法剔除非店铺分支。
2.3 正则表达式
全部信息的正则表达式提取如下:
for item in soup_find:
item = str(item)
imgsrc = re.findall(re.compile(r’data-src=“http(.*?)😕/(.*?).meituan.net/(.*?)”'), item) # 图片
title = re.findall(re.compile(r’
(.*?)
'), item) # 店名if title == []: #
- 标签会筛选出一些非店铺的分支,由于title是店铺信息一定含有的信息,使用title筛选,留下店铺信息
-
pass
else:
if imgsrc == []:
img = []
else:
img = [“http” + (imgsrc[0])[0] + “😕/” + (imgsrc[0])[1] + “.meituan.net/” + (imgsrc[0])[2]]
branch = re.findall(re.compile(r’分店’), item) # 分店
if branch == “分店”:
ifbranch = [“1”]
else:
ifbranch = [“0”]
if re.findall(re.compile(r’
(.*?)'), item) == []:star = []
score = []
else:
star = (re.findall(re.compile(r’
(.*?)'), item)[0])[0] # 星级
score = (re.findall(re.compile(r’
(.*?)'), item)[0])[1] # 评分
numraters = re.findall(re.compile(r’(.*?)\s*条评价'), item) # 评分人数
avgprice = re.findall(re.compile(r’人均\s*¥(.*?)'), item) # 人均价格
taste = re.findall(re.compile(r’口味(.*?)'), item) # 口味
enviro = re.findall(re.compile(r’环境(.*?)'), item) # 环境
serv = re.findall(re.compile(r’服务(.*?)'), item) # 服务
variety = re.findall(
re.compile(r’<a data-click-name=“shop_tag_cate_click”.*?">(.*?)'),
item) # 菜品种类
zone = re.findall(
re.compile(r’<a data-click-name=“shop_tag_region_click”.*?">(.*?)'),
item) # 地址分区
address = re.findall(re.compile(r’(.*?)\s*'), item) # 详细地址
recommend = re.findall(re.compile(
r’<a class=“recommend-click” data-click-name=“shop_tag_dish_click”.*?target=“_blank”>(.*?)'),
item) # 推荐菜
tg_info = re.findall(re.compile(
r’\s*团购:(.*?)\s*'),
item) # 团购信息
coupon = re.findall(re.compile(r’优惠:(.*?)\s*'), item) # 优惠信息
data = []
data.append(img)
data.append(title)
data.append(ifbranch)
data.append(star)
data.append(score)
data.append(numraters)
data.append(avgprice)
data.append(taste)
data.append(enviro)
data.append(serv)
data.append(variety)
data.append(zone)
data.append(address)
data.append(recommend)
data.append(tg_info)
data.append(coupon)
datalist.append(data)
提取结果:
[[‘http://p0.meituan.net/biztone/193986969_1624004529519.jpeg%40340w_255h_1e_1c_1l%7Cwatermark%3D0’], [‘桂满陇-锦绣江南(万象城店)’], [0], ‘45’, ‘4.66’, [‘\uec0e\ue10c1\uf819’], [‘\uec0e\ue498’], [‘\ue82c.\uf819\ue3b9’], [‘\ue82c.\uecd2\ue82c’], [‘\ue82c.\ue3b9\uf819’], [‘浙\ue913’], [‘\uf35e\ue12a\ueac9’], [‘吴\uf136\uf36b1599\uf75f\uea4c象\uf7d04\uf370402A\uf089\ue668’], [‘吮指鸡爪’, ‘石锅沃豆腐’, ‘公主素蟹粉’], [‘桂满陇·西湖船宴!仅售388元!价值454元的招牌必尝四人餐1份,提供免费WiFi。’], []
3. 字体反爬
3.1 字体反爬方式
上图爬出的数据中有较多
\uec0e\ue10c1\uf819
类型的乱码。这是因为大众点评采用Web字体反爬的方式。
”即通过创建自定义字体,改变部分常用字符的Unicode编码。由于服务器端记录了新字体与Unicode编码之间的映射关系,网页端能够识别改变了Unicode编码后的字符并正常显示。然而,当爬虫直接爬取HTML源码并访问子标签值时,由于本地没有对应的字体文件,就无法正常解析Unicode编码,从而显示为方框。“(来源:https://www.cnblogs.com/weosuper/p/13954662.html)

以评价为例,直接爬取的信息会是乱码的形式,因此需要进一步对爬取数据进行解码。

3.2 获取网页字体库

以shopNum字体为例,提取css文件,地址
http://s3plus.meituan.net/v1/mss_0a06a471f9514fc79c981b5466f56b91/svgtextcss/3a1fbc361fa4c6a862e661e34778709f.css

可以看到网页共定义了4种字体:PingFangSC-Regular-shopNum;PingFangSC-Regular-tagName;PingFangSC-Regular-address;PingFangSC-Regular-reviewTag。(进一步分析可发现字体文件名两两一致,即网页端实际上使用了两种字体,这会为之后的解码减轻一定工作量)

搜索找到该URL在HTML源码中的位置

进一步缩小范围,发现svgtextcss可以唯一对应该字段。据此,使用正则表达式提取地址,访问css文件,在解码后的文件中再次使用正则表达式解析得到woff字体文件存储。此段代码如下:
def getWoff(baseURL):
url = baseURL + “1”
html = askURL(url)
print(html)
css_str = re.findall(re.compile(r’href=“(.*?)svgtextcss(.*?).css”>'), html)
css_url = “http:” + css_str[0][0] + “svgtextcss” +css_str[0][1] + “.css”
html_css = str(urllib.request.urlopen(urllib.request.Request(css_url)).read())
文末有福利领取哦~
👉一、Python所有方向的学习路线
Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

👉二、Python必备开发工具

👉三、Python视频合集观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

👉 四、实战案例
光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。(文末领读者福利)

👉五、Python练习题
检查学习结果。

👉六、面试资料
我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。


👉因篇幅有限,仅展示部分资料,这份完整版的Python全套学习资料已经上传
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
本文介绍了如何使用Python爬取大众点评上海万象城的店铺信息,包括图片、标题、分店状态、评分、口味、环境、服务等详情。在字体反爬方面,通过提取CSS文件解析自定义字体,解决Unicode编码乱码问题。提供了详细的步骤、代码示例和学习资源,适合Python爬虫初学者。

被折叠的 条评论
为什么被折叠?



