经过一个多星期的学习,对 python 的语法有了一定了解,马上动手做了一个爬虫,检验学习效果。 这次爬取数据的目标是:豆瓣电影 Top250 中每一部电影的名称、排名、链接、名言 和 评分。 准备工作第一步:向服务器发送请求,获得响应由于豆瓣电影 Top250 上信息均在 html 源码中,故需获取其源码,使用 requests 库。代码如下: import requests def get_html(url): response = requests.get(url) # 发送get请求 if response.status_code == 200: # 如果服务器响应成功,返回网页源代码 return response.text else: print("访问失败")
第二步:对源码进行解析,提取单页分析
首先分析原网页代码:
发现我们所需要的信息都在li 标签中,所以我们需要定位。在li 标签中提取信息。但是,我们又发现:在真正含有我们所需要的信息的li 标签前,还有19个不含我们所需信息的li 标签: 所以,在提取信息的时候需要将前19个li 标签排除在外,在对含有我们所需内容的li 标签进行分析: 可以看到: 影片名为<span class="title"标签的文本内容; 排名为<em 标签的文本内容; 链接是<a 标签中href属性对应的值; 名言为标签<span class="inq" 的文本内容; 评分为<span class="rating_num" property="v:average" 的文本内容;
利用这些信息就可以利用find() 函数定位信息,进行提取。 代码如下: from bs4 import BeautifulSoup def parse_html(html): soup = BeautifulSoup(html, 'lxml') # 创建BeautifulSoup对象,使用lxml解析库 items = soup.find_all(name='li') # 查询名称为li的元素,以列表形式输出 for item in items[19:]: # 注意这里的[19:],对网页源码分析后发现前19个li标签中并没有我们需要的数据,所以将其排除在外 yield { # 利用find()函数定位我们需要的数据,并作为生成器元素 'title': item.span.get_text(), # 影片名 'index': item.find(name='em').text, # 影片排名 'image': item.find(name='a')['href'], # 影片链接 'quote': item.find(class_="inq").text, # 影片名言 'score': item.find(class_="rating_num").text # 影片评分 } # 构造生成器,作为函数的返回结果 # 获取Tag对象的文本信息有三种方法,.string、.text、.get_text()
以上完成了对豆瓣电影一页源代码的解析,接下来进行多页的解析,将250部电影的信息全部爬取下来: 多页爬取在换页的时候,我们发现网页的 URL 发生了改变: 我们发现,每跳一页,URL中参数start 的值就增加25,所以可将start 作为偏移量,来定位每一页网址。 代码如下: # 解析源码 def main(start): url = 'https://movie.douban.com/top250?start=' + str(start) + '&filter' # 定位top250的url html = get_html(url) # 获取源码 for item in parse_html(html): print(item)
if __name__ == '__main__': for page in range(10): main(page * 25) # 遍历10页,250部电影
将爬取到的信息写入txt文件:定义如下函数,实现将数据写入txt文件的操作 def write_to_file(content): with open("movies.txt", 'a', encoding='utf-8') as file: #以追加的权限打开文件movies.txt file.write(json.dumps(content, ensure_ascii=False) + '\n') # ensure_ascii设为False,保证输出是中文形式,而不是ASCII编码 # json.dumps()序列化时默认对中文使用ascii编码
这样就实现了豆瓣电影top250的爬取。 全部代码:# 爬取豆瓣top250 import requests import json from bs4 import BeautifulSoup
# 获取源码 def get_html(url): response = requests.get(url) if response.status_code == 200: return response.text else: print("访问失败")
# 解析源码 def parse_html(html): soup = BeautifulSoup(html, 'lxml') # 创建BeautifulSoup对象,使用lxml解析库 items = soup.find_all(name='li') # 查询名称为li的元素,以列表形式输出 for item in items[19:]: # 注意这里的[19:],对网页源码分析后发现前19个li标签中并没有我们需要的数据,所以将其排除在外 yield { # 利用find()定位我们需要的数据,并作为生成器元素 'title': item.span.get_text(), 'index': item.find(name='em').text, 'image': item.find(name='a')['href'], 'quote': item.find(class_="inq").text, 'score': item.find(class_="rating_num").text } # 构造生成器,作为函数的返回结果
# 将数据转化为json字符串并写入到文件中 def write_to_file(content): with open("movies.txt", 'a', encoding='utf-8') as file: # 以追加的权限打开文件movies.txt file.write(json.dumps(content, ensure_ascii=False) + '\n') # ensure_ascii设为False,保证输出是中文形式,而不是ASCII编码 # json.dumps()序列化时默认对中文使用ascii编码
def main(start): url = 'https://movie.douban.com/top250?start=' + str(start) + '&filter' # 定位top250的url html = get_html(url) for item in parse_html(html): print(item) write_to_file(item)
# 执行函数,完成爬取 if __name__ == '__main__': for i in range(10): main(i * 25)
从中的感觉就是,基本的语法、函数的使用是比较简单的;关键之处在于对网页源码的分析,找到合适的提取信息的方式。 输出结果{'title': '肖申克的救赎', 'index': '1', 'image': 'https://movie.douban.com/subject/1292052/', 'quote': '希望让人自由。', 'score': '9.6'} {'title': '霸王别姬', 'index': '2', 'image': 'https://movie.douban.com/subject/1291546/', 'quote': '风华绝代。', 'score': '9.6'} {'title': '这个杀手不太冷', 'index': '3', 'image': 'https://movie.douban.com/subject/1295644/', 'quote': '怪蜀黍和小萝莉不得不说的故事。', 'score': '9.4'} {'title': '阿甘正传', 'index': '4', 'image': 'https://movie.douban.com/subject/1292720/', 'quote': '一部美国近现代史。', 'score': '9.4'} {'title': '美丽人生', 'index': '5', 'image': 'https://movie.douban.com/subject/1292063/', 'quote': '最美的谎言。', 'score': '9.5'} {'title': '泰坦尼克号', 'index': '6', 'image': 'https://movie.douban.com/subject/1292722/', 'quote': '失去的才是永恒的。 ', 'score': '9.3'} {'title': '千与千寻', 'index': '7', 'image': 'https://movie.douban.com/subject/1291561/', 'quote': '最好的宫崎骏,最好的久石让。 ', 'score': '9.3'} {'title': '辛德勒的名单', 'index': '8', 'image': 'https://movie.douban.com/subject/1295124/', 'quote': '拯救一个人,就是拯救整个世界。', 'score': '9.4'} {'title': '盗梦空间', 'index': '9', 'image': 'https://movie.douban.com/subject/3541415/', 'quote': '诺兰给了我们一场无法盗取的梦。', 'score': '9.3'} {'title': '机器人总动员', 'index': '10', 'image': 'https://movie.douban.com/subject/2131459/', 'quote': '小瓦力,大人生。', 'score': '9.3'} {'title': '忠犬八公的故事', 'index': '11', 'image': 'https://movie.douban.com/subject/3011091/', 'quote': '永远都不能忘记你所爱的人。', 'score': '9.3'} {'title': '三傻大闹宝莱坞', 'index': '12', 'image': 'https://movie.douban.com/subject/3793023/', 'quote': '英俊版憨豆,高情商版谢耳朵。', 'score': '9.2'} {'title': '海上钢琴师', 'index': '13', 'image': 'https://movie.douban.com/subject/1292001/', 'quote': '每个人都要走一条自己坚定了的路,就算是粉身碎骨。 ', 'score': '9.2'} {'title': '放牛班的春天', 'index': '14', 'image': 'https://movie.douban.com/subject/1291549/', 'quote': '天籁一般的童声,是最接近上帝的存在。 ', 'score': '9.2'} {'title': '大话西游之大圣娶亲', 'index': '15', 'image': 'https://movie.douban.com/subject/1292213/', 'quote': '一生所爱。', 'score': '9.2'} {'title': '楚门的世界', 'index': '16', 'image': 'https://movie.douban.com/subject/1292064/', 'quote': '如果再也不能见到你,祝你早安,午安,晚安。', 'score': '9.2'} {'title': '教父', 'index': '17', 'image': 'https://movie.douban.com/subject/1291841/', 'quote': '千万不要记恨你的对手,这样会让你失去理智。', 'score': '9.2'} {'title': '龙猫', 'index': '18', 'image': 'https://movie.douban.com/subject/1291560/', 'quote': '人人心中都有个龙猫,童年就永远不会消失。', 'score': '9.1'} {'title': '星际穿越', 'index': '19', 'image': 'https://movie.douban.com/subject/1889243/', 'quote': '爱是一种力量,让我们超越时空感知它的存在。', 'score': '9.2'} {'title': '熔炉', 'index': '20', 'image': 'https://movie.douban.com/subject/5912992/', 'quote': '我们一路奋战不是为了改变世界,而是为了不让世界改变我们。', 'score': '9.2'} ....... ....... {'title': '荒野生存', 'index': '230', 'image': 'https://movie.douban.com/subject/1905462/', 'quote': '出门必备:本草纲目。', 'score': '8.6'} {'title': '英国病人', 'index': '231', 'image': 'https://movie.douban.com/subject/1291853/', 'quote': 'In memory, love lives forever...', 'score': '8.5'} {'title': '血钻', 'index': '232', 'image': 'https://movie.douban.com/subject/1428175/', 'quote': '每个美丽事物背后都是滴血的现实。', 'score': '8.5'} {'title': '聚焦', 'index': '233', 'image': 'https://movie.douban.com/subject/25954475/', 'quote': '新闻人的理性求真。', 'score': '8.8'} {'title': '国王的演讲', 'index': '234', 'image': 'https://movie.douban.com/subject/4023638/', 'quote': '皇上无话儿。', 'score': '8.3'} {'title': '迁徙的鸟', 'index': '235', 'image': 'https://movie.douban.com/subject/1292281/', 'quote': '最美的飞翔。', 'score': '9.1'} {'title': '非常嫌疑犯', 'index': '236', 'image': 'https://movie.douban.com/subject/1292214/', 'quote': '我不信仰上帝,但我敬畏上帝。', 'score': '8.6'} {'title': '勇士', 'index': '237', 'image': 'https://movie.douban.com/subject/3217169/', 'quote': '热血沸腾,相当完美的娱乐拳击大餐。', 'score': '8.9'} {'title': '燕尾蝶', 'index': '238', 'image': 'https://movie.douban.com/subject/1307793/', 'quote': '现实与童话交相辉映的旅程。', 'score': '8.6'} {'title': '黑鹰坠落', 'index': '239', 'image': 'https://movie.douban.com/subject/1291824/', 'quote': '还原真实而残酷的战争。', 'score': '8.6'} {'title': '遗愿清单', 'index': '240', 'image': 'https://movie.douban.com/subject/1867345/', 'quote': '用剩余不多的时间,去燃烧整个生命。', 'score': '8.5'} {'title': '穆赫兰道', 'index': '241', 'image': 'https://movie.douban.com/subject/1292217/', 'quote': '大卫·林奇的梦境迷宫。', 'score': '8.3'} {'title': '我爱你', 'index': '242', 'image': 'https://movie.douban.com/subject/5908478/', 'quote': '你要相信,这世上真的有爱存在,不管在什么年纪 ', 'score': '9.0'} {'title': '叫我第一名', 'index': '243', 'image': 'https://movie.douban.com/subject/4798888/', 'quote': '乐观比一切都有力量。', 'score': '8.6'} {'title': '枪火', 'index': '244', 'image': 'https://movie.douban.com/subject/1300741/', 'quote': '一群演技精湛的戏骨,奉献出一个精致的黑帮小品,成就杜琪峰群戏的巅峰之作。', 'score': '8.6'} {'title': '荒岛余生', 'index': '245', 'image': 'https://movie.douban.com/subject/1298653/', 'quote': '一个人的独角戏。', 'score': '8.5'} {'title': '2001太空漫游', 'index': '246', 'image': 'https://movie.douban.com/subject/1292226/', 'quote': '现代科幻电影的开山之作,最伟大导演的最伟大影片。', 'score': '8.7'} {'title': '上帝也疯狂', 'index': '247', 'image': 'https://movie.douban.com/subject/1297478/', 'quote': '纯净原始的笑与感动。', 'score': '8.6'} {'title': '千钧一发', 'index': '248', 'image': 'https://movie.douban.com/subject/1300117/', 'quote': '一部能引人思考的科幻励志片。', 'score': '8.7'} {'title': '大卫·戈尔的一生', 'index': '249', 'image': 'https://movie.douban.com/subject/1305725/', 'quote': '捍卫人权只是信仰,一点不妨碍其行为的残忍。', 'score': '8.6'} {'title': '蓝色大门', 'index': '250', 'image': 'https://movie.douban.com/subject/1308575/', 'quote': '青春的窃窃私语。 ', 'score': '8.3'}
是不是很有趣,好了今天就到这里吧!See You! 本篇图文由团队 郭维强 同学提供,他的 CSDN Blog 地址为: https://blog.csdn.net/qq_43271202
经过8年多的发展,LSGO软件技术团队在地理信息系统、数据统计分析、计算机视觉领域积累了丰富的研发经验,也建立了人才培养的完备体系。
|