20-8-28: 竟然更新了6位css类名, 不过稍微修改下正则就可以了
上一篇的链接👇
https://blog.youkuaiyun.com/weixin_43553295/article/details/108242732
获取页面数据
首先写一个简单的爬虫, 来获取页面数据
class DaZhongDianPing:
def __init__(self):
self.s = requests.session()
self.url = "http://www.dianping.com/shop/k9oYRvTyiMk4HEdQ/review_all"
self.headers = {
'user-agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.135 Safari/537.36",
"Cookie": "xxxxxx"
}
self.html = None
def get_html(self):
"""获取数据"""
response = self.s.get(self.url, headers=self.headers)
self.html = response.text
记得添加最关键的user-agent
和Cookie
, 否则你连最基本的网页都获取不到, 这里我就不把自己的cookie
放出来了, 自己登陆后随便打开一条请求后复制即可
使用xpath来获取用户评论信息
def get_data_by_xpath(self):
"""使用xpath获取用户信息"""
html_xpath = etree.HTML(self.html)
# 获取评论以及用户
user_data_list = html_xpath.xpath(
"//li/div[@class='main-review']//a[@class='name']/text()|"
"//li/div[@class='main-review']//span[@class='name']/text()")
user_data_list = [x.strip() for x in user_data_list]
user_comment_list = html_xpath.xpath(
"//ul/li/div[@class='main-review']/div[@class='review-words']|"
"//ul/li/div[@class='main-review']/div[@class='review-words Hide']")
if len(user_data_list) == len(user_comment_list):
print("以使用xpath获取信息...")
else:
print("获取用户名个数为: ", len(user_data_list))
print("获取评论信息个数为: ", len(user_comment_list))
raise SyntaxError("用户评论信息不匹配, 请检查xpath...")
# pprint(name) ",口味"
# 获取用户评论div 转html代码为汉字
comments_html_list = [html.unescape(tostring(x).decode('utf-8')) for x in user_comment_list]
# pprint(comments_html_list)
return comments_html_list, user_data_list
分别在网页中取出用户名和他所发的评论, 因为要直接获取div
里的所有内容, 使用xpath
的text()
就明显不够用了, 直接使用tostring()
方法将xpath
对象转换为字符串格式, 在使用unescape()
将html
代码中的字符转换为汉字, 达到能将div中标签和内容一起取出来的效果
解密特殊标签
获取文件, 提取css类
首先获取css
文件内容, 类的坐标还有.svg
文件都在css
文件中
def get_css_file(self):
"""获取css文件名"""
# 获取字体文件
css_file_name = re.search(r'<link rel="stylesheet" type="text/css" href="(//s3plus.+?\.css)', self.html).group(
1)
self.css_file_name = css_file_name[css_file_name.rfind('/') + 1:]
print("下载文件...", css_file_name)
# 下载css文件
self.css = self.s.get("http:" + css_file_name).text
with open(os.path.</