Python案例实操1-网络爬虫
Python案例实操1-网络爬虫
案例1:使用Python爬虫、sqlite技术爬取x半电影Top250的电影数据,并保存成Excel文件和数据库文件
- 新建.py文件,定义程序运行的入口
if __name__ == "__main__":pass
分析爬取的网址信息
x半电影TOP250,分析网址的规律,点击下一页可以发现每次点击都会在网址后面拼接上start参数,参数表示上一页结束新一页开始开始爬取网页, 爬取网页过程就是解析数据的过程,里面会使用到urllib.request模块获取网页数据、BeautifulSoup模块解析数据、re正则表达式模块匹配查找数据等
def getData(baseurl):"""爬取网页"""datalist = []for i in range(0, 10): # 遍历页数url = baseurl + str(i * 25) # 拼接URL,指定开始位置html = askUrl(url)# 解析网页数据soup = BeautifulSoup(html, "html.parser")for item in soup.find_all("div", class_="item"): # 遍历指定查找结果列表data = [] # 保存电影信息item = str(item) # 将item转成字符串link = re.findall(patlink, item)[0] # 查找电影详情链接data.append(link)imgstr = re.findall(patimg, item)[0] # 电影图片data.append(imgstr)titles = re.findall(pattitle, item) # 电影名称,有多个名字if len(titles) == 2:data.append(titles[0]) # 中文名data.append(titles[1].replace("/", "")) # 外文名, 去掉多余/else:data.append(titles[0])data.append("") # 外文名留空score = re.findall(patscore, item)[0] # 评分data.append(score)num = re.findall(patpeople, item)[0] # 评价人数data.append(num)desc = re.findall(patdesc, item) # 一句话描述if len(desc) != 0:data.append(desc[0])else:data.append("")bd = re.findall(patbd, item)[0] # 背景信息bd = re.sub("<br(\s+)?/>(\s+)?", "", bd.strip()) # 去除<br/>标签, strip()去空格data.append(bd)datalist.append(data)return datalist
- 通过request请求数据时,经常会遇到反爬虫的网站,会报状态码418错误,需要我们手动设置headers来模拟正常用户请求,跳过反爬虫的拦截
def askUrl(baseurl):"""获取指定URL网页数据"""# 设置headers来模拟正常用户请求header = {"User-Agent": "Mozilla / 5.0(Windows NT 10.0; Win64; x64) AppleWebKit / 537.36(KHTML, like Gecko) Chrome / 97.0.4692.99 Safari / 537.36 Edg / 97.0.1072.69"}req = urllib.request.Request(baseurl, headers=header)response = urllib.request.urlopen(req)html = response.read().decode("utf-8")return html
解析得到我们所需要的数据后,使用sqlite模块保存到数据库文件中,方便后续对数据的处理(如词云生成,后面会有案例)
连接数据库,并建立movie表
def init_db(dbpath):"""初始化数据库"""conn = sqlite3.connect(dbpath)# 获取游标c = conn.cursor()# 建表sql语句sql1 = "drop table if exists movie;"sql2 = '''create table movie(link_detail varchar not null, link_img varchar, c_title varchar not null, o_title varchar,score number, num int, desc varchar, bd text)'''c.execute(sql1)c.execute(sql2)conn.commit()conn.close()
- 将数据保存到数据库中
def insert(datalist, dbpath):"""数据库新增操作"""conn = sqlite3.connect(dbpath)c = conn.cursor()print("%d 条数据待写入数据库" % len(datalist))for move in datalist:for index in range(0, len(move)):if index == 4 or index == 5:continuemove[index] = '"' + move[index].strip() + '"' # 给value加上双引号, 数字类型不用加sql = '''insert into movie(link_detail, link_img, c_title, o_title, score, num, desc, bd)values(%s)''' % ','.join(move) # value之间用,连接c.execute(sql)conn.commit()c.close()conn.close()
- 运行程序,生成movie.db数据库文件,大功告成!
- 附上程序完整代码 spider.py
import urllib.request
from bs4 import BeautifulSoup
import re
import xlwt
import sqlite3# 匹配规则
# 电影详情
patlink = re.compile(r'a href="(.*?)">')
# 电影图片
patimg = re.compile(r'<img.*src="(.*?)"', re.S) # re.S:让换行符也包含在字符串中
# 电影名称
pattitle = re.compile(r'<span class="title">(.*?)</span>')
# 电影评分
patscore = re.compile(r'<span class="rating_num" property="v:average">(.*?)</span>')
# 影评人数
patpeople = re.compile(r'<span>(\d*)人评价</span>')
# 电影概况
patdesc = re.compile(r'<span class="inq">(.*?)</span>')
# 电影背景
patbd = re.compile(r'<p class="">(.*?)</p>', re.S)def getData(baseurl):"""爬取网页"""datalist = []for i in range(0, 10): # 遍历页数url = baseurl + str(i * 25) # 拼接URL,指定开始位置html = askUrl(url)# 解析网页数据soup = BeautifulSoup(html, "html.parser")for item in soup.find_all("div", class_="item"): # 遍历指定查找结果列表data = [] # 保存电影信息item = str(item) # 将item转成字符串link = re.findall(patlink, item)[0] # 查找电影详情链接data.append(link)imgstr = re.findall(patimg, item)[0] # 电影图片data.append(imgstr)titles = re.findall(pattitle, item) # 电影名称,有多个名字if len(titles) == 2:data.append(titles[0]) # 中文名data.append(titles[1].replace("/", "")) # 外文名, 去掉多余/else:data.append(titles[0])data.append("") # 外文名留空score = re.findall(patscore, item)[0] # 评分data.append(score)num = re.findall(patpeople, item)[0] # 评价人数data.append(num)desc = re.findall(patdesc, item) # 一句话描述if len(desc) != 0:data.append(desc[0])else:data.append("")bd = re.findall(patbd, item)[0] # 背景信息bd = re.sub("<br(\s+)?/>(\s+)?", "", bd.strip()) # 去除<br/>标签, strip()去空格data.append(bd)datalist.append(data)return datalistdef askUrl(baseurl):"""获取指定URL网页数据"""# 设置headers来模拟正常用户请求header = {"User-Agent": "Mozilla / 5.0(Windows NT 10.0; Win64; x64) AppleWebKit / 537.36(KHTML, like Gecko) Chrome / 97.0.4692.99 Safari / 537.36 Edg / 97.0.1072.69"}req = urllib.request.Request(baseurl, headers=header)response = urllib.request.urlopen(req)html = response.read().decode("utf-8")return htmldef saveData(datalist, filepath):"""保存数据到Excel文件中"""workbook = xlwt.Workbook(encoding="utf-8") # 创建Workbook对象sheet = workbook.add_sheet("豆瓣电影TOP250", cell_overwrite_ok=True) # 创建工作页col = ("详情链接", "图片链接", "影片中文名", "影片外文名", "影片评分", "评分人数", "影片概述", "相关信息") # 标题for i in range(0, len(col)):sheet.write(0, i, col[i]) # 写入标题 参数:“行”, “列”, “内容”for i in range(0, 250):move = datalist[i] # 遍历影片信息 "行"for j in range(0, len(col)): # "列"sheet.write(i + 1, j, move[j]) # 注意:从第二行开始写入影片信息workbook.save(filepath) # 保存到文件def init_db(dbpath):"""初始化数据库"""conn = sqlite3.connect(dbpath)# 获取游标c = conn.cursor()# 建表sql语句sql1 = "drop table if exists movie;"sql2 = '''create table movie(link_detail varchar not null, link_img varchar, c_title varchar not null, o_title varchar,score number, num int, desc varchar, bd text)'''c.execute(sql1)c.execute(sql2)conn.commit()conn.close()def insert(datalist, dbpath):"""数据库新增操作"""conn = sqlite3.connect(dbpath)c = conn.cursor()print("%d 条数据待写入数据库" % len(datalist))for move in datalist:for index in range(0, len(move)):if index == 4 or index == 5:continuemove[index] = '"' + move[index].strip() + '"' # 给value加上双引号, 数字类型不用加sql = '''insert into movie(link_detail, link_img, c_title, o_title, score, num, desc, bd)values(%s)''' % ','.join(move) # value之间用,连接c.execute(sql)conn.commit()c.close()conn.close()def saveToSqlite(datalist, dbpath):"""保存数据到Sqlite文件中"""# 初始化数据库连接init_db(dbpath)# 将数据插入表中insert(datalist, dbpath)if __name__ == "__main__":baseurl = "https://movie.douban.com/top250?start=";# 1.爬取网页datalist = getData(baseurl)# 2.保存数据到Excel中# filepath = "豆瓣电影TOP250.xls"# saveData(datalist, filepath)# 3.保存数据到sqlitedbpath = "movie.db"saveToSqlite(datalist, dbpath)print("爬取成功!")
Python案例实操1-网络爬虫相关推荐
- python案例实操_用案例实操学习Python ,培养编程逻辑思维
案例一: A.B.C.D.E 五人在某天夜里合伙去捕鱼,到第二天凌晨时都疲惫不堪,于是各自找地方睡觉. 日上三杆 A 第一个醒来,他将鱼分为五份,把多余的一条鱼扔掉,拿走自己的一份. B 第二个醒来, ...
- 数据模型同学看过来|代码案例实操来袭
去年年底,央行开出反洗钱罚单,多家银行合计被罚1040万元. 当时,中国人民银行石家庄中心支行披露的反洗钱行政处罚信息公示表显示,因涉及未按照规定履行客户身份识别义务等,中行.邮储.浦发三家银行以及阳 ...
- 【李刚-21天通关Python-27】之 案例实操:函数装饰器应用
[李刚-21天通关Python-27]之 案例实操:函数装饰器应用 一.函数装饰器的广泛应用 @staticmethod 和 @classmethod 的本质就是函数装饰器 staticmethod ...
- 基于创龙TMS320C665x平台GigE工业相机图像采集案例实操笔记
基于创龙TMS320C665x平台GigE工业相机图像采集案例实操笔记 开发平台:创龙TL665x-EasyEVM: 基于TI KeyStone C66x多核定点/浮点DSP TMS320C665x, ...
- 新硬盘挂载-fdisk+mount案例实操
新硬盘挂载-fdisk+mount案例实操 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 现在很多服务器都支持热插拔了,当有新的硬盘插入到服务器上我们需要将其分区,格式化,然后挂载 ...
- 【报告分享】见实私域流量白皮书:私域流量案例实操手册.pdf
大家好,我是文文(微信:sscbg2020),今天给大家分享见实科技于2020年10月份发布的报告<见实私域流量白皮书:私域流量案例实操手册.pdf>. 本报告共73页,包含如下鞋服.餐饮 ...
- 自定义OutputFormat案例实操
自定义OutputFormat案例实操 文章目录 1)需求 2)需求分析 3)编程实现 1.创建Mapper类 2.创建Reducer类 3.创建OutputFormat类 4.创建RecordWri ...
- MapReduce入门(一)—— MapReduce概述 + WordCount案例实操
MapReduce入门(一)-- MapReduce概述 文章目录 MapReduce入门(一)-- MapReduce概述 1.1 MapReduce 定义 1.2 MapReduce 优缺点 1. ...
- Azkaban配置Work Flow案例实操
Work Flow案例实操 目录 Work Flow案例实操 1. Yarm语法简介 2. HelloWorld案例 3. JavaProcess案例 4. 作业依赖案例 5. 自动失败重试案例 6. ...
- 航空专场 | 无人机设计仿真流程讲解与案例实操
一.CFD在无人机上的应用 1.静.动气动系数计算以上介绍的无人机的流动状态一般为中低雷诺数,不可压缩流动.这些计算一般用S-A模型或者KW-SST模型进行计算,能够获得不错的工程精度.静.动气动力系 ...
最新文章
- CentOS 7.0系统安装配置图解教程
- Windows 8测试版安装图组
- JAVA程序禁用Hbase中的表_HBase禁用表
- python装饰器简单理解的小demo
- 随机投点法计算定积分java_11 随机模拟积分 | 统计计算
- 第一个MVVM wp7程序
- 公众号点击图片变成另一张_公众号互动内容:小众潮流or下一个风口?| 新榜观察...
- Cocos2d-x 发布 Android
- Linux的学习之路grep命令
- 安装Google版本的金山词霸会导致播放Silverlight视频的时候IE或者是FF崩溃
- 计算机实验报告protel,Protel99se实验报告.doc
- PMP学习笔记(一):PMP 目录
- KDJ指标公式的应用要则是什么KDJ指标公式的使用技巧是什么
- Meson构建系统(一)
- 7-1 数组插入元素 (10 分)
- Asp.net mvc5开源项目超级冷笑话
- iOS 15:如何查找丢失或失窃的 iPhone,就算它已关机也可远程定位
- python的全局静态变量
- 【原创】产品型IT公司向服务型公司转型
- java雪花_基于java实现的雪花算法