第三讲案例
猫眼电影top100信息提取
百度猫眼电影,https://maoyan.com/board/4
首先明确我们要爬取的内容是什么?
- 1、爬取top100中所有的电影信息,因此要获取每一页的url
- 2、精确爬取电影的标题、主演、上映时间、评分、电影详情页对应的id。使用正则表达式匹配。
整个程序完成以下四步:
1、第一步不再赘述,可以参考末尾代码或前两讲案例。
2、这里我们依旧想要使用开发者工具,来获取页面内容中目标内容的位置,使用正则表达式的整体思路是先获取所有内容都包含的闭合标签的内容,然后以此为基础获取每一条数据组成的列表,再分别获取不同的信息保存到字典中。
通过小三角,逐级将内容收起,直至获取所有电影都包含的双标签,效果如下:
正则表达式可以写为:
re.compile(r'<dl class="board-wrapper">(.*?)</dl>', re.S)
(.*?)万能表达式,非贪婪获取完整的dl闭合标签。re.S可以匹配换行符,否则拿不到内容。
再用正则匹配该内容获取单个电影的全部信息:
re.compile(r'<dd>(.*?)</dd>', re.S)
再逐步获取每条信息中不同的内容。注意正则匹配时不要将有变化的信息包含在表达式内,同时左右边界要明确。获取内容时search应使用组group获取内容,findall是列表。内容中前后可能有换行符、制表符、空格的可以使用字符串方法strip()去掉。
完整代码如下:
"""
使用正则表达式获取页面内容中的电影信息
"""
import requests, re, json
def get_response(url):
"""
通过url发送请求获取响应
:param url: 请求页面路由
:return: 响应内容
"""
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.92 Safari/537.36',
}
response = requests.get(url, headers=headers)
return response.text
def move_info(html_text):
"""
使用正则表达式筛选页面内容
:param html_text: 页面内容
:return: 电影信息
"""
# 匹配完整内容
patttern = re.compile(r'<dl class="board-wrapper">(.*?)</dl>', re.S)
move_list_c = patttern.search(html_text).group(1)
# print(move_list_c)
# 匹配每个电影的内容
patttern = re.compile(r'<dd>(.*?)</dd>', re.S)
move_list = patttern.findall(move_list_c)
# print(move_list)
move_info_list = list()
# 循环获取每条电影的基本信息
for move in move_list:
move_info = dict()
title = re.search(r'title="(.*?)" class="image-link"', move , re.S).group(1)
# print(title) # 标题
star = re.search(r'<p class="star">(.*?)</p>', move, re.S).group(1).strip()
# print(star) # 主演
time = re.search(r'<p class="releasetime">上映时间:(.*?)</p>', move, re.S).group(1)
# print(time) # 上映时间
score = re.search((r'<i class="integer">(.*?)</i><i class="fraction">(.*?)</i>'), move, re.S).groups()
score = score[0] + score[1]
# print(score) # 评分
id = re.search(r'data-val="{movieId:(.*?)}', move, re.S).group(1)
# print(id) # 详情页url想要的id
# 保存到字典中
move_info['title'] = title
move_info['star'] = star
move_info['time'] = time
move_info['score'] = score
move_info['id'] = id
move_info_list.append(move_info)
return move_info_list
def get_move_info():
"""
爬取猫眼电影top100中电影的信息
:return: {move_info}
"""
# 1、准备url
base_url = 'https://maoyan.com/board/4?offset=%s'
move_info_all = list()
for i in range(10):
# 拼接url
url = base_url % (i*10)
# 2、发送请求获取页面内容
html_text = get_response(url)
# print(html_text)
#3、使用正则筛选页面内容
move_info_list = move_info(html_text)
# print(move_info_list)
move_info_all.extend(move_info_list)
print(move_info_all)
# 写入文件
with open('./爬取内容/move.text', 'w', encoding='utf-8') as fp:
fp.write(json.dumps(move_info_all))
if __name__ == '__main__':
get_move_info()
淘宝电场商品信息获取
仅获取几类产品的信息。https://www.taobao.com/markets/3c/tbdc?spm=a21bo.2017.201867-main.11.5af911d9WqhgGA
首先,数据保存在js文件中,问什么会在js文件中,会在第五讲动态HTML处理中详细讲解,这个案例仅为了演示如何使用正则表达式获取json格式的目标内容。
第一步,获取js请求url序列,需要滑动页面,js文件才会执行获取数据得到下图中的响应文件:
只需要获取几个url即可:
url = [
'https://drc.alicdn.com/7/1870321_2____?callback=jsonp1870321_2____',
'https://drc.alicdn.com/7/1870333_2____?callback=jsonp1870333_2____',
'https://drc.alicdn.com/7/1871654_2____?callback=jsonp1871654_2____',
'https://drc.alicdn.com/7/1871655_2____?callback=jsonp1871655_2____',
]
通过下图展示的数据可以看出,并不能直接得到json数据,而是在外侧包裹了一层,因此应先将json格式的字符串取出再转为字典和列表形式的数据。
这里使用正则表达式可以很方便的取出:
json_data = re.search(r'{.*}', response.text, re.S).group()
然后需要使用json模块的loads转换数据格式:
good = json.loads(json_data)
其余过程参考下述完整代码或者第二讲案例。
"""
淘宝电场商品信息获取
商品信息不再doc文件类型,储存在js文件中(ajax)
"""
import requests, re, json
def get_response(url):
"""
通过url获取json格式数据
:param url: 请求路由
:return: json—data
"""
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.92 Safari/537.36',
'referer': 'https://www.taobao.com/markets/3c/tbdc?spm=a21bo.2017.201867-main.11.5af911d9WqhgGA',
# '',
}
response = requests.get(url, headers=headers)
# print(response)
json_data = re.search(r'{.*}', response.text, re.S).group()
# print(json_data)
return json_data
def main():
"""
淘宝电场获取商品信息
:return:
"""
# 准备url列表
url = [
'https://drc.alicdn.com/7/1870321_2____?callback=jsonp1870321_2____',
'https://drc.alicdn.com/7/1870333_2____?callback=jsonp1870333_2____',
'https://drc.alicdn.com/7/1871654_2____?callback=jsonp1871654_2____',
'https://drc.alicdn.com/7/1871655_2____?callback=jsonp1871655_2____',
]
good_all_all = list()
for u in url:
# 发送请求获取响应
json_data = get_response(u)
# 将json数据转换为字典
good = json.loads(json_data)
good_list = good['result']
# print(good_list)
good_all = list()
for good in good_list:
# print(good)
try:
good_dict = dict()
good_dict['item_title'] = good['item_title']
good_dict['item_current_price'] = good['item_current_price']
# good_dict['item_pic'] = 'http:' + good['item_pic']
# good_dict['item_url'] = 'https:' + good['item_url']
good_all.append(good_dict)
except Exception:
continue
good_all_all.extend(good_all)
print(good_all_all)
if __name__ == '__main__':
main()
感谢各位耐心的阅读和支持!