'''#一、爬虫原理
1.什么是互联网?
指的是一堆网络设备,把一台台的计算机互联网到一起称之为互联网
2.互联网建立的目的?
互联网建立的目的是为了数据的传递以及数据的共享
3.上网的全过程:
普通用户:打开浏览器-》往目标站点发送请求-》获取相应数据-》渲染到浏览器中
爬虫程序:模拟浏览器-》往目标站点发送请求-》获取相应数据-》提取有价值的数据-》持久化到数据中
4.什么是数据?
例如淘宝京东商品信息等
东方财富,雪球网等一些证券投资信息
链家网房源信息,12306票务信息等
5.浏览器发送的是什么请求?
http协议的请求。
https://www.jd.com/
www.jd.com(京东域名)-》DNS解析-》京东服务器的 IP和端口
http + ssl://www.jd.com/
客户端的IP和端口-》服务器的IP和端口 发送请求可以建立链接获取相应数据
6.爬虫的全过程
-发送请求 (需要请求库:Requests请求库;Selenium请求库)
-获取响应数据 (只要往服务器发送请求,请求通过后会返回响应数据)
-解析并提取数据 (需要解析库:re、BeautifulSoup4、Xpath...)
-保存到本地 (文件处理、数据库、MongoDB存储库)
二、Requests请求库
1、安装与使用
-打开cmd
-输入:rip3 install requests
或者File->Settings->Project->+->requests->install
'''
import requests #导入请求库
#往百度主页发送请求,获取响应对象
response = requests.get(url='https://www.baidu.com/')
#设置字符编码为 utf-8
response.enconding = 'utf-8'
#打印响应文本
print(response.text)
#把响应文本写入本地
with open('baudu.html','w',encoding = 'utf-8')as f:
f.write(response.text)
#视频选项
#1.梨视频
import requests
#
#video_url = 'https://www.pearvideo.com/video_1570107'
#response = requests = requests.get(url=video_url)
#print(response.text)
#往视频源地址发送请求
response = requests.get('https://video.pearvideo.com/mp4/adshort/20190625/cont-1570107-14054821_adpkg-ad_hd.mp4')
#打印二进制流,比如图片、视频等数据
print(response.content)
with open('视频.mp4','wb')as f:
f.write(response.content)
#1.先往梨视频主页发送请求
#https://www.pearvideo.com/
#解析获取所有视频的id:
#video_1570302
#re.findall()
#2.获取视频详情页url:
#惊险!男子强地铁
#https://www.pearvideo.com/video_1570302
#揭秘坎儿井
#https://www.pearvideo.com/video_1570107
import requests
import re #正则,用于解析文本数据
#1.先往梨视频主页发送请求
response = requests.get('https://www.pearvideo.com/')
#print(response.text)
#re正则匹配获取所有视频id
#参数1:正则匹配规则
#参数2:解析文本
#参数3:匹配模式
res_list = re.findall('<a href="video_(.*?)"',response.text,re.S)
#print(res_list)
for v_id in res_list:
detail_url = 'https://www.pearvideo.com/video_' + v_id
# print(detail_url)
#对每一个视频详情页发送请求获取视频源url
response = requests.get(url=detail_url)
#print(response.text)
#解析并提取详情页视频url
#视频url
video_url = re.findall('srcUrl="(.*?)"',response.text,re.S)[0]
print(video_url)
#视频名称
video_name = re.findall('<h1 class="video-tt">(.*?)</h1>',response.text,re.S)[0]
print(video_name)
#往视频url发送请求获取视频二进制流
v_response = requests.get(video_url)
with open('%s.mp4'%video_name,'wb')as f:
f.write(v_response.content)
print(video_name,'视频爬取完成')
#3.抓包分析
#打开浏览器的开发者模式(检查)-》选中network
#找到访问的页面后缀 xxx.html(响应文本)
#1)请求url(访问的网站地址)
#2)请求方式:
#GET:直接获取数据
#https://www.cnblogs.com/kermitjam/articles/9692597.htlm
#POST:需要携带用户信息发送到目标地址
'''https://www.cnblogs.com/login
{
'user':'tank'
'pwd':'123'
}'''
#3)响应状态码:
#2xx:成功
#3xx:重定向
#4xx:找不到资源
#5xx:服务器错误
#4)请求头信息
#User-Agent:用户代理(证明是通过电脑设备以及浏览器发送的请求)
#Cookies:登录用户真实信息(证明你是目标网站的用户)
#Referer:上一次访问的url(证明你是从目标网站跳转过来的)
#5)请求体:
#POST请求才会有请求体
#From Data
'''{
'user':'tank'
'pwd':'123'
}'''
'''
https://movie.douban.com/top250?start=0&filter=
https://movie.douban.com/top250?start=25&filter=
https://movie.douban.com/top250?start=50&filter=
...
1.发送请求
2.解析数据
3.保存数据
'''
#爬虫三部曲
#1.发送请求
def get_page(base_url):
response = requests.get(base_url)
return response
#2.解析文本
def parse_index(text):
res = re.findall('')
#print(res)
return res
#3.保存数据
def save_data(data):
with open('douban.txt','a',encoding = 'utf-8')as f:
f.write(data)
#main + 回车键
if name ==' main ':
#num = 10
#base_url = 'https://movie.douban.com/top250?start={}&filter='.format(num)
num=0
for line in range(10):
base_url = f'https://movie.douban.com/top250?start={num}&filter='
num +=25
print(base_url)
#1.发送请求,调用函数
response = get_page(base_url)
#2.解析文本
movie_list = parse_index(response.text)
#3.保存数据
#数据的格式化
for movie in movie_list
print(movie)
#解压赋值
#电影排名,电影url,电影名称,导演,主演,类型,电影评分,评价人数,电影简介
v_top,v_url,v_name,v_doc,v_point,v_num,v_desc = movie
#v_top = movie[0]
#v_url = movie[1]
movie_content = f'''
电影排名:{v_top}
电影url:{v_url}
电影名称:{v_name}
导演主演:{v_doc}
电影评分:{v_point}
评价人数:{v_num}
电影简介:{v_desc}
\n
'''
ptint(movie_content)
#保存数据
save_data(movie_content)
'''四、爬取豆瓣电影
.:从当前位置开始
*:查找所有
?:找到第一个不找
.*:非贪婪匹配
.*:贪婪匹配
(.*?):提取括号内的数据
电影排名,电影url,电影名称,导演,主演,类型,电影评分,评价人数,电影简介
<div class="item">.*?<em class="">(.*?)</em>
.*?<a href="(.*?)">.*?span class="title">(.*?)</span>
.*?导演:(.*?)</p>.*?span class="rating_num".*?>(.*?)</span>
.*?<span>(.*?)人评价</span>.*?<span class="inq">(.*?)</span>