爬虫豆瓣电影存入csv文件
需要用到的第三方库:
requests(Python HTTP请求工具)
lxml(解析网页结构工具)
beautifulsoup4(网页文档解析工具)
先贴上代码
import requests from bs4 import BeautifulSoup import csv #1.新建一个csv的文件 to_be_show=open ('D:\\豆瓣最近上映电影.csv','w',encoding='gbk',newline='') writer=csv.writer(to_be_show) #CVS写入的参数为一个list writer.writerow(['电影名','链接','海报','上映日期','类型','地区','想看人数']) #2.发送请求,获取即将上映电影 response=requests.get('https://movie.douban.com/cinema/later/hangzhou/') html_content=response.content.decode('utf-8') response.close() #3.解析html格式的响应内容 soup=BeautifulSoup(html_content,'lxml') all_movies=soup.find('div',id='showing-soon') #新建一个列表接收所有电影信息 all_movies_list=[] for each_movie in all_movies.find_all('div',class_='item'): tag_a=each_movie.find_all('a') tag_li=each_movie.find_all('li') movie_name=tag_a[1].text movie_link=tag_a[1]['href'] movie_poster=tag_a[0].find('img')['src'] movie_date=tag_li[0].text movie_type=tag_li[1].text movie_area=tag_li[2].text movie_want_see=tag_li[3].text.replace('人想看','') #打印一下 print('名字:{name},链接:{link},海报:{poster},上映日期:{date},类型:{type},地区:{area},想看人数:{want_see}'. format(name=movie_name,link=movie_link,poster=movie_poster,date=movie_date,type=movie_type,area=movie_area,want_see=movie_want_see)) all_movies_list.append({'名字':movie_name,'链接':movie_link,'海报':movie_poster,'上映日期':movie_date,'类型':movie_type,'地区':movie_area,'想看人数':movie_want_see}) #4.用sorted将所有电影按想看的人数反序排列,x为all_movies_list中的每一个元素 all_movies_list=sorted(all_movies_list,key=lambda x:int(x['想看人数']),reverse=True) #将电影信息写入cvs文件 for movie_list in all_movies_list: writer.writerow([movie_list['名字'],movie_list['链接'],movie_list['海报'],movie_list['上映日期'],movie_list['类型'],movie_list['地区'],movie_list['想看人数']]) #关闭文件 to_be_show.close()
CSV文件
1.requests库介绍
Python用来发送http请求的第三方库
(1)自动管理cookie:requests.session(),之后使用session请求,就会自动带上所有的cookie
import requests session = requests.session() response = session.get("https://www.baidu.com") print(response.content.decode('utf-8'))
手动添加cookie
import requests session=requests.session() cooikes={ 'BAIDUID':'B9993D9D407D57107F43D82B60A348BE:FG=1', 'BIDUPSID':'B9993D9D407D57107F43D82B60A348BE', 'PSTM':'1551667335', } requests.utils.add_dict_to_cookiejar(session.cookies,cooikes)
2.lxml库介绍
3.beautifulsoup4库介绍
beautifulsoup4是一个可以从HTML或XML文件中提取数据的Python库,他可以选择几个不同的解析器:
html.parser(Python原生自带,速度慢,容错能力差)
html5lib(Python自带,速度慢)
lxml(需要安装,Python最快,还可以解析xml文件)
beautifulsoup4介绍链接:https://www.crummy.com/software/BeautifulSoup/bs4/doc/index.zh.html
(1)初始化BeautifuSoup的参数
soup=BeautifulSoup(html_content,'lxml')
第一个参数 html_content是网页的源代码,可以是个Unicode字符串,也可以是一个二进制字符串(如果第一个参数是字符串并且网页自带了charset信息,BS会默认采用网页的默认编码解码,否则默认以你当前文件
执行的编码(通常是utf-8)进行解析。如果是二进制字符串,如果自己手动指定了编码,就以指定编码解析,否则默认utf-8解析)。
html.parser
进行解析(2)BeautifulSoup的基本使用语法规则
——find() 使用示例
soup.find('a'),会返回在soup包含的源代码中,遇到的第一个<a>...</a>标签内容对象。
soup.find('a', id='next'),会返回在soup包含的源代码中,遇到的第一个有属性为id,值为next的<a>对象,比如<a id="next">...</a>。(不只可以用id,大部分其他的属性都可以直接使用,比如src、name。 值得注意的是,class这个属性因为是Python关键字,不能直接使用,所以在BS里面,使用class_='...'进行代替 )
find返回的结果,依然可以继续使用find()或者find_all()方法。如果找不到指定的内容,find会返回None
——find_all()使用示例
soup.find_all('a'),会返回在soup包含的源代码中,遇到的所有<a>...</a>标签内容的可迭代对象(返回一个 list)。
soup.find_all('a', class_='next'),会返回在soup包含的源代码中,遇到的所有属性为class,值为next的<a>的 可迭代对象,比如<a class="next">...</a>。(语法和find也一样,class也不能直接写)
find_all返回的“list”中的单个对象 依然可以继续使用find()或者find_all()方法。如果找不到指定的内容,find_all会返回一个空的“list”。
——获取元素的某个属性
soup['src'],取出soup对象的src属性。如果该属性不存在,那么程序会报错。
——获取元素中的所有文本
soup.text,假设soup对象为<div>你好<a>复联</a></div>,那么这个操作返回字符串是"你好复联"。
注意:BeautifulSoup的find('a')是查找第一个<a></a>标签,find_all('a')是查找所有<a></a>标签,和selenium使用xpath查找标签不同,xpath是按html层级查找标签,刚开始接触BeautifulSoup被搞混淆了
原文参考:https://www.jianshu.com/p/011abdcee7e4
原文地址:https://www.cnblogs.com/yjh1995/p/11836864.html
- sql语句的简化(r2第7天)
- Ajax jsonp 跨域请求实例
- asp.net动态解析用户控件(UserControl)
- 找到多个与名为“Home”的控制器匹配的类型的解决方案
- 关于sequence问题的紧急处理(r2第26天)
- 使用动态变量进行动态数据比较(r2笔记25天)
- MVC分部视图@Html.Partial
- 基于马尔科夫链的产品评估预测
- MVC 控制器中传递dynamic(对象) 给视图
- 使用copy命令解决LONG类型的困扰(r2第24天)
- MVC 获取路由的 URL 参数值和默认值的集合。
- 用libsvm进行回归预测
- mvc路由配置.html结尾的伪静态
- 【编程基础】Java的接口和抽象类
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- ViewPager实现漂亮的引导页
- Android FTP 多线程断点续传下载上传的实例
- Android如何调用系统相机拍照
- Android开发之设置开机自动启动的几种方法
- Android图片等比例缩放和填充屏幕效果
- Android中自定义ImageView添加文字说明详解
- Android 中ThreadLocal的深入理解
- 100行Android代码轻松实现带动画柱状图
- Android编程绘图操作之弧形绘制方法示例
- 详解Android中Application设置全局变量以及传值
- Android编程调用红外线遥控功能示例
- Android实现图文垂直跑马灯效果
- Android 实现截屏功能的实例
- android仿微信通讯录搜索示例(匹配拼音,字母,索引位置)
- Android通过overScrollBy实现下拉视差特效