Python实现的爬取豆瓣电影信息功能案例
作者:爆炒小青蛙 发布时间:2023-07-18 21:59:25
本文实例讲述了Python实现的爬取豆瓣电影信息功能。分享给大家供大家参考,具体如下:
本案例的任务为,爬取豆瓣电影top250的电影信息(包括序号、电影名称、导演和主演、评分以及经典台词),并将信息作为字典形式保存进txt文件。这里只用到requests库,没有用到beautifulsoup库
step1:首先获取每一页的源代码,用requests.get函数获取,为了防止请求错误,使用try...except..
def getpage(url):
try:
res=requests.get(url)
if res.status_code==200:
return res.text
return None
except RequestException:
return None
step2:做每一页的网址解析,打开原网址https://movie.douban.com/top250?,查看网页源代码,可以看到每一个电影的源代码都是从<li>开始,在</li>处结束,写好正则表达式以后爬到的列表的每一条item都有五个元素,因此将其写成字典的形式,这里用到yield函数(关于yield函数的用法,廖老师的有一篇文章比较好懂https://www.ibm.com/developerworks/cn/opensource/os-cn-python-yield/)
对单个网页的进行解析的代码如下:
def parsepage(html):
pat=re.compile('<li>.*?<em class="">(.*?)</em>.*?<img width="100" alt="(.*?)" src=.*?<p class="">'
+'(.*?)</p>.*?property="v:average">(.*?)</span>.*?<span class="inq">(.*?)</span>.*?</li>',re.S)
items=re.findall(pat,html)
for item in items:
yield{
'index':item[0],
'title':item[1],
'stars':item[2].strip(),
'score':item[3],
'concept':item[4]
}
下面的代码是将每一个item写入文件,这里encoding='utf-8' 和ensure_ascii=False都是使写入文件时中文能保持不变,json.dumps可以将(字典)对象转化成字符串(但前面要先import json),with open的第二个参数为a,表示每次写入时,是往后追加(续接),而不是后一次写入将之前内容覆盖,\n是指要每一次写入一个item之后要换行。
def write_tofile(content):
with open('doubanfilms.txt','a',encoding='utf-8' ) as f:
f.write(json.dumps(content,ensure_ascii=False)+'\n')
f.close()
最后,需要用循环语句将每一页(共10页)内容都进行以上操作。这里,第二页的网址就是在第一页的url上加上一个start=25, 第三页是加上start=50,也就是每一页的start=为25*i。最后一段代码如下:
def main():
url="https://movie.douban.com/top250?"
for i in range(0,9):
url_i=url+'start='+str(25*i)
html_i=getpage(url_i)
for item in parsepage(html_i):
print(item)
write_tofile(item)
if __name__ == '__main__':
main()
当然,这一段代码还有一种写法:
def main(start):
url="https://movie.douban.com/top250?start="+str(start)
html=getpage(url)
for item in parsepage(html):
print(item)
write_tofile(item)
if __name__ == '__main__':
for i in range(10):
main(i*10)
如果想让你的程序跑的更快,可以用多线程爬虫(当然这里其实没有必要):
#在最开始加载Pool包
from multiprocessing import Pool
#最后的执行段改为:
if __name__ == '__main__':
for i in range(10):
main(i*10)
pool=Pool() #在循环外写
pool.map(main,[i*10 for i in range (10)])
希望本文所述对大家Python程序设计有所帮助。
来源:https://blog.csdn.net/ISMedal/article/details/79218542
猜你喜欢
- 对win32 COM不是很熟悉,不知道一个程序究竟有多少属性或者方法可以操作。仅仅是一个Sheet页的添加就费了我好长时间,因为这种成功来自
- PHP mysqli_set_charset()函数设置默认客户端字符集:<?php// 假定数据库用户名:root,密码:12345
- 正在看的ORACLE教程是:ORACLE常见错误代码的分析与解决(三)。  
- 前言如果你之前没用过进度条,八成是觉得它会增加不必要的复杂性或者很难维护,其实不然。要加一个进度条其实只需要几行代码。from alive_
- 前言:本文的主要内容是介绍Python中 if 语句及其使用,包括条件测试、if -else 语句、if -elif-else 语句以及使用
- 官方文档的示例中没有我们习惯的日期格式,查了很多博客转换日期和时间戳也都是大概的能得到结果的方式,常将 datetime 和 time 两个
- 今天碰到一个很有意思的问题,需要将普通的 Unicode字符串转换为 Unicode编码的字符串,如下:将 \\u9500\\u552e 转
- 简介本文主要简述如何通过sklearn模块来进行预测和学习,最后再以图表这种更加直观的方式展现出来数据集学习数据预测数据数据处理数据分离因为
- 有时候,我们需要将文本转换为图片,比如发长微博,或者不想让人轻易复制我们的文本内容等时候。目前类似的工具已经有了不少,不过我觉得用得都不是很
- Display SQL Server Login Mode. Supported Plat
- 版本更新,原来user里的password字段已经变更为authentication_string版本更新 缘故,好多网上的教程都不适用了,
- 废话不多说了,直接给大家贴代码了,具体代码如下所示:--sql中的 where 、group by 和 having 用法解析--如果要用到
- 禁用admin中models的编辑链接和添加删除按钮方法如下:class MyModelAdmin(models.ModelAdmin):
- 本文实例为大家分享了js实现滑动进度条效果的具体代码,供大家参考,具体内容如下进度条:<!DOCTYPE html><ht
- “'验证码'等于'流氓软件'”这句话本身存在逻辑问题,因为“验证码”并不是一个软件,而是软件里的一个功能。这
- 具体的网址倒是没保存,可是我这个人习惯把好的代码记起方法保存下来,现在贴出来,希望原作者体谅。 ---上个月月初第一天 select CON
- 在Web 开发中,JavaScript的一个很重要的作用就是对DOM进行操作,可你知道么?对DOM的操作是非常昂贵的,因为这会导致浏览器执行
- 这是工作期间同事想要个截完图之后可以显示并且永远前置的截图小工具(即不会被其他程序覆盖)直接上代码:# # -*- coding: utf-
- 看下面的一组例子:alert(true.toString());alert(false.toString());alert(1.123.to
- Python最大的优点之一就是语法简洁,好的代码就像伪代码一样,干净、整洁、一目了然。要写出 Pythonic(优雅的、地道的、整洁的)代码