阶段学习总结之07 爬虫案例汇总
概要
-
爬糗图百科(正则/bs4)
-
爬取优美图库的高清图片
-
爬取梨视频汽车视频数据
-
爬取豆瓣电影top250
-
爬取链接二手房数据
-
爬取汽车之家新闻数据
-
防盗链
-
利用openpyxl操作Excel文件
详情
-
爬糗图百科(正则/bs4)
正则
import requests import os import re # 1.图片在网页上,直接发送请求即可 qiushiRes = requests.get('https://www.qiushibaike.com/imgrank/') resText = qiushiRes.text # 2.通过正则匹配糗图 imgList = re.findall('<img src="(.*?)" alt="糗事.*"', resText) # 3.判断是否存在存放图片文件夹,不存在则创建 if not os.path.exists(r'糗图'): os.mkdir(r'糗图') # 4.循环获得的图片 for imgLink in imgList: # 5.组合图片链接 realLink = "https:"+imgLink # 6.向图片链接发送get请求,返回流文件 image = requests.get(realLink, stream=True) # 7.新建图片文件 with open(r'糗图\{}'.format(imgLink.split('/')[-1]), 'wb') as f: # 8.逐行写入 for line in image.iter_content(): f.write(line)
bs4
import requests from bs4 import BeautifulSoup import os # 1.图片在网页上,直接发送请求即可 qiushiRes = requests.get('https://www.qiushibaike.com/imgrank/') resText = qiushiRes.text # 2.构造解析器对象 soup = BeautifulSoup(resText, 'lxml') # 3.判断是否存在存放图片文件夹,不存在则创建 if not os.path.exists(r'糗图'): os.mkdir(r'糗图') # 34.查找图片 imgTagList = soup.find_all(name='img', attrs={'class': 'illustration'}) for img in imgTagList: # 4.拼接完整链接 realLink = 'https:' + img.get('src') # 5.向图片链接发送get请求,返回流文件 image = requests.get(realLink, stream=True) # 6.新建图片文件 with open(r'糗图\{}'.format(img.get('src').split('/')[-1]), 'wb') as f: # 8.逐行写入 for line in image.iter_content(): f.write(line)
-
爬取优美图库的高清图片
import requests from bs4 import BeautifulSoup import os import time # 1.判断存放图片的目录是否存在,不存在则自动创建 if not os.path.exists(r'动漫图片'): os.mkdir(r'动漫图片') # 2.图片首页地址 pageUrl = 'https://www.umei.cc/katongdongman/dongmantupian/' # 3.向该地址发送get请求 res = requests.get(pageUrl) # 4.指定合适的字符编码 res.encoding = 'UTF-8' # 5.构造html解析器 soup = BeautifulSoup(res.text, 'lxml') # 6.筛选图片所在的页面布局标签 divTag = soup.find(name='div', attrs={'class': 'TypeList'}) # 7.筛选页面布局下的列表标签 liList = divTag.find_all(name='li') # 8.获取每个a标签的href属性 imgDetailTag = [li.a.get('href') for li in liList] # 9.将每个href属性值补全成完整网址(图片详情页) imgDetailUrlList = ['https://www.umei.cc'+imgDetailUrl for imgDetailUrl in imgDetailTag] # 10.循环图片详情页 for imgDetail in imgDetailUrlList: # 11.向图片详情页发送请求 res1 = requests.get(imgDetail) # 12.对图片详情页构造html解析器 soupD = BeautifulSoup(res1.text, 'lxml') # 13.获取img标签 imgBigTag = soupD.select('div.ImageBody img') # 14.select返回结果需要循环,获取图片链接 for imgBig in imgBigTag: # 15.设置时间延迟 time.sleep(1) print(imgBig.get('src')) # 16.向大图链接发送请求 img = requests.get(imgBig.get('src'), stream=True) # 17.拼接文件路径 filePath = os.path.join(r'动漫图片', imgBig.get('src').split('/')[-1]) # 18.保存图片 with open(filePath, 'wb') as f: for line in img.iter_content(): f.write(line)
-
爬取梨视频汽车视频数据
# 引入发送网络请求的模块 import requests # 引入处理HTML文件的模块 from bs4 import BeautifulSoup # 引入文件操作模块 import os # 引入时间模块 import time # 1.判断存放视频的目录是否存在,不存在则自动创建 if not os.path.exists(r'梨视频_Car'): os.mkdir(r'梨视频_Car') def getVideo(n): """ 获取梨视频汽车板块全部视频方法 参数n : 起始视频索引 """ # 1.梨视频汽车板块和主页的url carUrl = 'https://www.pearvideo.com/category_loading.jsp?reqType=5&categoryId=31&start={}'.format(n) baseUrl = 'https://www.pearvideo.com/' # 2.向梨视频汽车板块发送get请求 carRes = requests.get(carUrl) # 3.针对梨视频汽车板块的网页构造html解析器 carSoup = BeautifulSoup(carRes.text, 'lxml') # 4.获取所有存放视频的li标签 liList = carSoup.find_all(name='li', attrs={'class': 'categoryem'}) # 5.获取a标签的href值,同时也是视频编号 videoDetailList = [li.a.get('href') for li in liList] # 6.循环视频编号 for video in videoDetailList: # 主动延迟 time.sleep(1) # 7.获取视频编号 videoCode = video # 8.获取视频id videoId = videoCode.split('_')[-1] # 9.向视频链接发送请求 videoRes = requests.get('https://www.pearvideo.com/videoStatus.jsp', params={'contId': videoId}, headers={'referer': baseUrl + videoCode} ) # 9.将返回结果反序列化 dataJson = videoRes.json() # 10.获取视频链接 srcUrl = dataJson.get('videoInfo').get('videos').get('srcUrl') # 11.需要获取真实链接 realUrl = srcUrl.replace(dataJson.get('systemTime'), 'cont-{}'.format(videoId)) # 12.向真实视频链接发送请求 realVideoRes = requests.get(realUrl, stream=True) # 13.拼接文件路径 filePath = os.path.join(r'梨视频_Car', '{}.mp4'.format(videoId)) # 14.以写模式打开文件 with open(filePath, 'wb') as f: # 16.按行读取视频 for line in realVideoRes.iter_content(): f.write(line) print('视频{}下载成功!!!'.format(videoId)) """调用此方法""" for n in range(12, 48, 12): getVideo(n)
-
爬取豆瓣电影top250
import time from openpyxl import Workbook import requests from bs4 import BeautifulSoup import re def getMovies(n, ws): """ 获得豆瓣电影top250 参数 n: 页码 """ # 1.指定基础网址 baseUrl = 'https://movie.douban.com/top250?start={}'.format(n * 25) # 2.发送get请求获得豆瓣电影top250首页 res = requests.get(baseUrl, headers={ 'referer': 'https://movie.douban.com/top250?start=0', 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36' }) # 3.构造针对豆瓣电影top250首页的解析器 soup = BeautifulSoup(res.text, 'lxml') # 4.获取电影列表的祖先标签 class为item的div标签 divItemTags = soup.select('div.item') # 5.循环存放电影的li标签 for movie in divItemTags: time.sleep(1) # 6.获取电影名称 title = movie.span.text # 7.获取电影导演和主演混合的文本 dmText = movie.select('div.bd')[0].p.text # 8.获取导演姓名 director = re.findall('导演: (.*?) ', dmText)[0] # 9.获取主演姓名(可能为空) mainActor = '' if len(re.findall('主演: (.*?) ', dmText)) > 0: mainActor = re.findall('主演: (.*?) ', dmText)[0] # 10.获取评分 ratingNum = movie.select('span.rating_num')[0].text # 11.获取评价人数 ratingCount = movie.select('div.star span')[3].text # 12.获取座右铭(可能为空) motto = '' if len(movie.select('p.quote>span.inq')) > 0: motto = movie.select('p.quote>span.inq')[0].text # 13.将电影相关信息添加至excel文件相关表末尾 ws.append([title, director, mainActor, ratingNum, ratingCount, motto]) """爬取电影排行""" # 1.新建excel文件对象 wbMovie = Workbook() # 2.创建工作表 ws250 = wbMovie.create_sheet('豆瓣电影top250') # 3.定义表头 ws250.append(['电影名称', '导演姓名', '主演姓名', '评分', '评价人数', '座右铭']) # 4.输入需要的页数 pageNum = int(input('想看几页的电影排行:').strip()) # 5.调用方法 for page in range(pageNum): getMovies(int(page), ws250) # 6.保存表格文件 wbMovie.save(r'豆瓣电影top250_{}.xlsx'.format(time.strftime('%Y-%m-%d')))
-
爬取链接二手房数据
import time import requests from bs4 import BeautifulSoup from openpyxl import Workbook # 1.创建Excel表格文件 wbHouse = Workbook() # 2.创建工作表 ws1 = wbHouse.create_sheet('某地区二手房', 0) ws1.append(['房屋名称', '详情链接', '小区名称', '区域名称', '详细信息', '关注人数', '发布时间', '总价(万元)', '单价(元/平)']) def handleInfo(info): """ 分割详细信息 户型,大小,朝向,装修程度,楼层,年代,楼型 """ details = info.split('|').strip() if not len(details) == 7: details[0] = info return details def getTwoHandHouse(city, area, n): """ 获取特定地区房屋信息 房屋名称,详情链接,小区名称,区域名称,详细信息(可拆分),关注人数,发布时间,总价,单价 """ # 1.指定网站url twoHandUrl = 'https://{}.lianjia.com/ershoufang/{}/pg{}/'.format(city, area, n) # 2.定义请求头 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36" } # 3.发送请求 resBS = requests.get(twoHandUrl, headers=headers) # 4.利用解析库筛选数据 soup = BeautifulSoup(resBS.text, 'lxml') # 5.找到显示房屋信息的列表 houseList = soup.select('ul.sellListContent>li') # 6.循环当页所有房屋 for house in houseList: # 1.获取存放名称、链接的a标签 aTag = house.select('div.title>a')[0] if not aTag: continue # 获取房屋名称 houseName = aTag.text # 获取详情链接 link = aTag.get('href') # 2.获取存放小区、地区的div标签 divPosiTag = house.select('div.positionInfo')[0] posi = divPosiTag.text.split('-') # 根据是否有不可分割的位置信息,做不同处理 if len(posi) == 2: estateName = posi[0] estateArea = posi[1] elif len(posi) == 1: estateName, estateArea = posi[0] else: estateName, estateArea = '' # 3.获取存放详细信息的div标签 divInfoTag = house.select('div.houseInfo')[0] # 获取详细信息 info = divInfoTag.text # 分割详细信息 # detail =handleInfo(info) # 4.获取关注度与发布时间的div标签 divFollowTag = house.select('div.followInfo')[0] focusTime = divFollowTag.text # 获取关注人数 peopleNum = focusTime.split('/')[0].strip() # 获取发布时间(多少天以前) publishTime = focusTime.split('/')[1].strip() # 5.获取总价标签 divTotalTag = house.select('div.totalPrice')[0] # 获取总价 totalPrice = divTotalTag.span.text # 6.获取单价标签 divUnitTag = house.select('div.unitPrice')[0] # 获取单价 unitPrice = divUnitTag.text.strip('元/平') ''' 主动延迟 ''' time.sleep(1) # 7.将数据添加至Excel表格文件 ws1.append([houseName, link, estateName, estateArea, info, peopleNum, publishTime, totalPrice, unitPrice]) num = int(input('请输入需要的二手房页数: ').strip()) # 按页获取二手房 for n in range(1, num): getTwoHandHouse('sh', 'baoshan', n) # 保存文件 wbHouse.save('二手房.xlsx')
-
爬取汽车之家新闻数据
import time import requests from bs4 import BeautifulSoup from openpyxl import Workbook # 1.创建Excel表格文件 wbCar = Workbook() # 2.创建工作表 ws1 = wbCar.create_sheet('汽车之家新闻', 0) ws1.append(['标题', '详情链接', '图标', '发布时间', '简介']) def getCarNews(n): """ 获取汽车之家新闻相关信息 标题、链接、图标、发布时间、简介 """ # 1.指定汽车之家新闻网的链接 carNewsUrl = 'https://www.autohome.com.cn/news/{}/#liststart'.format(n) # 2.定义请求头 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36" } # 2.向汽车之家发送请求 carRes = requests.get(carNewsUrl, headers=headers) # 3.避免乱码,按照响应设置字符编码 carRes.encoding = 'GBK' # 4.构造html文件解析器 carSoup = BeautifulSoup(carRes.text, 'lxml') # 5.先查找存放新闻信息的li标签 newsList = carSoup.select("ul.article>li") for news in newsList: # 1.获取链接 aTag = news.find('a') if not aTag: continue link = 'https:' + aTag.get('href') # 2.获取标题 if not aTag.find('h3'): continue title = aTag.find('h3').text # 3.获取发布时间 if not aTag.select('span.fn-left'): continue pubTime = aTag.select('span.fn-left')[0].text # 4.获取图标 img = '' if aTag.find('img'): img = 'https:' + aTag.find('img').get('src') # 5.获取简介 desc = '' if aTag.find('p'): desc = aTag.find('p').text print(link, '\n', title, '\n', img, '\n', pubTime, '\n', desc, '\n', '******************') # 6.将数据添加到Excel表格文件 ws1.append([title, link, img, pubTime, desc]) # 主动延迟 time.sleep(1) # 输入想要获取的新闻数目 pageNum = input('请输入想要获取的汽车新闻的数量(页): ').strip() # 按页获取新闻 for n in range(1, pageNum): # 调用爬取汽车之家新闻信息的函数 getCarNews() # 保存文件 wbCar.save('车闻.xlsx')
-
防盗链
防爬措施:校验当前请求从何而来
1.本网站 - > 允许访问 2.其他网址 - > 拒绝 在请求头中有一个专门用于记录来源的键值对 referer : 本网站地址
-
利用openpyxl操作Excel文件
1、excel文件具有两种不同的后缀名。
03版本之前 .xls
03版本之后 .xlsx
2、利用Python代码操作Excel表格文件的模块有很多种。
openpyxl:近几年较流行,可用于操作03版本之后的excel文件,对于之前的老版本兼容性不好
xlrd、xlwt:分别控制对Excel表格文件的读取和写入,可操作任意版本的表格
3、Excel本质并不是一个文件,将其后缀改为.zip可以看到,Excel表格是由多个文件组成的文件夹,类似于网页。
openpyxl模块并不是内置模块,需要从其他地址下载。
pip3 install openpyxl
创建文件
1、使用表格需要先引入模块
from openpyxl import Workbook
2、创建一个Workbook对象(Excel文件)
wb = Workbook()
3、创建一个或多个工作表(sheet)
ws1 = wb1.create_sheet('第一张表') ws2 = wb1.create_sheet('第二张表')
4、保存文件
wb.save(r'001.xlsx')
5、创建工作表的时候可以指定顺序
ws3 = wb1.create_sheet('第三张表', 0)
6、返回当前被创建的工作表对象
# 修改工作表名字 ws3.title = '表名被改了哦!' # 修改工作表名称的样式 ws3.sheet_properties.tabColor = "1072BA" # 查看当前excel文件所有的工作表名称,返回列表 print(wb1.sheetnames)
创建表相当于文件操作中的写模式(w),会将原有内容全部删除再重新创建新内容!!!
向Excel表格写入数据
1、引入创建Excel表格文件的方法
from openpyxl import Workbook
2、创建一个Workbook对象(Excel文件)
wb2 = Workbook() ws2 = wb.create_sheet('数据统计', 0) # 写入方式1 ws2['A1'] = 111 ws2['A2'] = 222 # 写入方式2 # cell表示单元格对象 ws2.cell(column=2, row=3, value=2233) # 写入方式3 # 适用于批量写入数据,空值用None或者''代替 ws2.append(['序号', '姓名', '年龄', '性别']) ws2.append([1, 'Leoric', '', 'male']) ws2.append([2, None, 18, 'female']) '''append方法按照行录入数据''' #也可以写入计算公式 ws2['A9'] = '=SUM(A2:A8)' # 保存文件 wb2.save(r'002.xlsx')
引入加载Excel表格文件的方法
from openpyxl import load_workbook
2、指定要读取的Excel表格文件
rb = load_workbook(r'2.xlsx')
3、查看全部工作表名,选择要操作的表
print(rb.sheetnames)
4、指定要操作的工作表
ws3 = rb['数据统计'] # 读取方式1 ws3['B3'].value # 2233 ws3['A9'].value # =SUM(A2:A8) # 读取方式2 工作表对象名.cell(row=行序,column=列序).value
5、也可以按照行或者列读取
# 按行读取 for row in ws3.rows: for r in row: print(r.value) # 按列读取 for col in ws3.columns: for c in col: print(c.value)
如果读取数据的时候需要读数据的值而不是公式本身!!!
# 加载表的时候指定data_only参数为真 rb = load_workbook(r'002.xlsx', data_only=True)

浙公网安备 33010602011771号