2019.6.14
昨日回顾
爬虫原理:
什么是爬虫
爬虫指的是爬取数据
什么是互联网
由一堆网络设备把一台一台的计算机互联到一起
互联网建立的目的
数据的传递与共享
上网的全过程:
-普通用户
打开浏览器—>往目标站点发送请求—>接受响应数据—>渲染到页面上
-爬虫程序
模拟浏览器—>往目标站点发送请求—>接受响应数据—>
-请求方式:
GET、POST
-请求头
cookies
user-agent
host
爬虫的全过程:
1、发送请求(请求库)
-requests模块
-selenium模块
2、获取相应数据(服务器返回)
3、解析并提取数据(解析库)
-bs4(BeautifulSoup4)
-Xpath
4、保存数据(存储库)MongoDB
-MongoDB
1、3、4需要手动写
-爬虫框架
Scrapy(基于面向对象)
爬取梨视频:
1、分析网站的视频源地址
2、通过requests网站视频源地址发送请求
3、获取视频的二进制流,并保存到本地
今日内容
requests模块的详细应用
selenium模块
1、爬取梨视频
''' 访问url https://www.pearvideo.com/ 请求方式: Get 请求头: user-agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36 ''' import requests import re response =requests.get(url="https://www.pearvideo.com/") print(response.status_code) #print(response.text) #re.findall('正则匹配规则','解析文本',"正则模式") #re.S:全局模式(对整个文本进行匹配) #.指的是当前位置 #*指的是查找所有 ''' <a href="video_1543373" <a href="video_(.*?)" #提取1543373 ''' #获取主页视频详情ID res=re.findall('<a href="video_(.*?)"',response.text,re.S) print(res) for m_id in res: detail_url='http://www.pearvideo.com/video_'+m_id print(detail_url)
2、爬取整个详情页的视频内容
import requests import re #正则模块 #uuid.uuid()可以时间戳生成一段世界上唯一的所及字符串 import uuid #爬虫三部曲 #1、发送请求 def get_page(url): response=requests.get(url) return response #2、解析数据 #解析主页获取视频详情页ID def parse_index(text): res=re.findall('<a href="video_(.*?)"',text,re.S) #print(res) detail_url_list=[] #存放所有视频链接 for m_id in res: #拼接详情页url detail_url = 'http://www.pearvideo.com/video_' + m_id #print(detail_url) detail_url_list.append(detail_url) #把每个视频链接添加进去 #print(detail_url_list) return detail_url_list #解析详情页获取视频url def parse_detail(text): ''' (.*?):提取括号内容 .*?:直接匹配 <video webkit-playsinline="" playsinline="" x-webkit-airplay="" autoplay="autoplay" src="https://video.pearvideo.com/mp4/adshort/20190613/cont-1565846-14013215_adpkg-ad_hd.mp4" style="width: 100%; height: 100%;"></video> 正则:<video.*?src="(.*?)" 正则:srcUrl="(.*?)" ''' movie_url=re.findall('srcUrl="(.*?)"',text,re.S)[0] #print(movie_url) return movie_url #3、保存数据 def save_movie(movie_url): response=requests.get(movie_url) #把视频写到本地 with open(f'{uuid.uuid4()}.mp4','wb') as f: f.write(response.content) f.flush() if __name__ == '__main__':#输入main加回车键 #1、对主页发送请求 index_res=get_page(url='http://www.pearvideo.com/') #2、对主页进行解析,获取详情页id detail_url_list=parse_index(index_res.text) #print(detail_url_list) #3、对每个详情页发送url请求 for detail_url in detail_url_list: detail_res=get_page(url=detail_url) #print(detail_res.text) movie_url=parse_detail(detail_res.text) print(movie_url) save_movie(movie_url)
3、高性能爬虫(多线程方法爬取详情页视频)
import requests import re #正则模块 #uuid.uuid()可以时间戳生成一段世界上唯一的所及字符串 import uuid #爬虫三部曲 #1、发送请求 def get_page(url): response=requests.get(url) return response #2、解析数据 #解析主页获取视频详情页ID def parse_index(text): res=re.findall('<a href="video_(.*?)"',text,re.S) #print(res) detail_url_list=[] #存放所有视频链接 for m_id in res: #拼接详情页url detail_url = 'http://www.pearvideo.com/video_' + m_id #print(detail_url) detail_url_list.append(detail_url) #把每个视频链接添加进去 #print(detail_url_list) return detail_url_list #解析详情页获取视频url def parse_detail(text): ''' (.*?):提取括号内容 .*?:直接匹配 <video webkit-playsinline="" playsinline="" x-webkit-airplay="" autoplay="autoplay" src="https://video.pearvideo.com/mp4/adshort/20190613/cont-1565846-14013215_adpkg-ad_hd.mp4" style="width: 100%; height: 100%;"></video> 正则:<video.*?src="(.*?)" 正则:srcUrl="(.*?)" ''' movie_url=re.findall('srcUrl="(.*?)"',text,re.S)[0] #print(movie_url) return movie_url #3、保存数据 def save_movie(movie_url): response=requests.get(movie_url) #把视频写到本地 with open(f'{uuid.uuid4()}.mp4','wb') as f: f.write(response.content) f.flush() if __name__ == '__main__':#输入main加回车键 #1、对主页发送请求 index_res=get_page(url='http://www.pearvideo.com/') #2、对主页进行解析,获取详情页id detail_url_list=parse_index(index_res.text) #print(detail_url_list) #3、对每个详情页发送url请求 for detail_url in detail_url_list: detail_res=get_page(url=detail_url) #print(detail_res.text) movie_url=parse_detail(detail_res.text) print(movie_url) save_movie(movie_url)
4、requests模块的详细应用
''' 访问发现知乎 请求url:https://www.zhihu.com/explore 请求方式l;GET 请求头: 'user-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36' cookie ''' #访问知乎 import requests # response=requests.get(url="https://www.zhihu.com/explore") # print(response.status_code) #400 # print(response.text)#错误页面 ''' params参数 访问百度搜查蔡徐坤url http://www.baidu.com/s?wd=安徽工程大学&pn=10 http://www.baidu.com/s?wd=安徽工程大学&pn=20 ''' from urllib.parse import urlencode #url='https://www.baidu.com/s?wd=%E8%94%A1%E5%BE%90%E5%9D%A4' #url='https://www.baidu.com/s?'+urlencode({"wd":"蔡徐坤"}) url='http://www.baidu.com/s?' headers={ 'user-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36' } #在get方法中添加params参数 #response=requests.get(url,headers=headers,params={"wd":"安徽工程大学"}) response=requests.get(url,headers=headers,params={"wd":"安徽工程大学","pn":"20"}) #print(url) with open('gongcheng2.html','w',encoding='utf-8') as f: f.write(response.text)
5、爬取豆瓣前25的电影信息(电影详情页url、图片链接、电影名称、电影评分、评价人数)
''' 主页:https://movie.douban.com/top250 GET user-agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36 re正则: # 电影详情页url、图片链接、电影名称、电影评分、评价人数 <div class="item">.*?href="(.*?)">.*?src="(.*?)".*?<span class="title">(.*?)</span>.*?<span class="rating_num".*?>(.*?)</span>.*?<span>(.*?)人评价 ''' import requests import re url="https://movie.douban.com/top250" headers={ 'user-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36' } #1、往豆瓣top250发送请求获取响应数据 response=requests.get(url,headers=headers) #print(response.text) #2、通过正则解析提取数据 # 电影详情页url、图片链接、电影名称、电影评分、评价人数 movie_content_list=re.findall( #正则规则 '<div class="item">.*?href="(.*?)">.*?src="(.*?)".*?<span class="title">(.*?)</span>.*?<span class="rating_num".*?>(.*?)</span>.*?<span>(.*?)人评价', #解析分析 response.text, #匹配模式 re.S ) for movie_content in movie_content_list: #解压赋值 detail_url,movie_jpg,name,point,num=movie_content data=f'电影名字:{name},详情页url:{detail_url},图片url:{movie_jpg},评分:{point},评价人数:{num}\n' print(data) #保存数据,把电影信息写入文件中 with open('douban.txt','a',encoding='utf-8') as f: f.write(data)
今日作业
对豆瓣前250的电影进行爬取,增加两条信息为:演出人员信息、电影简介
from lxml import etree import requests #爬取基本的豆瓣TOP250信息 #伪装浏览器,headers可以从开发人员工具中找到User-Agent headers={ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36' } def getResqutes(): urls=["https://movie.douban.com/top250?start={}".format(str(i)) for i in range(0,250,25)] for url in urls: data=requests.get(url,headers=headers) #此处是请求 html=etree.HTML(data.text) #网页的解析 count=html.xpath("//div[@class='item']") #这里是共有的xpath for info in count: title=info.xpath("div[2]/div[1]/a/span[1]/text()")#电影名称 start=info.xpath("div[2]/div[2]/div/span[2]/text()")#电影星评 detail=info.xpath("div[2]/div[2]/p[2]/span/text()") #电影的简介 for title,start,detail in zip(title,start,detail): result={ "title":title, "start":start, "detail":detail, } print(result) if __name__=='__main__': getResqutes()