day4作业

上课内容笔记

亓 2019/6/14 8:22:07
昨日回顾:
  爬虫原理:
  什么是爬虫?
    爬虫指的是爬取数据。
  什么是互联网?
    由一堆网络设备把一台一台的计算机互联到-起。
  互联网建立的目的?
    数据的传递与数据的共享。
  上网的全过程:
  一普通用户
    打开浏览器一>往目标站点发送请求一> 接收响应数据一>渲染到页面 上。
  一爬虫程序
    模拟浏览器一>往目标站点发送请求一>接收响应数据一> 提取有用的数据一> 保存到本地/教据库 。
 
  浏览器发送的是什么请求?
  http协议的请求:
    -请求url
    一请求方式:
    GET、POST

    一请求头:
    cookies
    user- agent
    host ;

  爬虫的全过程:
    1、发送请求(请求库)
      _requests模块
      _selenium模块

    2、获取响应数据<服务器返回>
 
    3、解析并提取数据(解析库)
      _bs4 (BeautifulSoup4)
      _Xpath
 
    4、保存数据(数据库)
      _MongoDB
 
    1、3、4需要手动写 


   爬虫框架
    Scrapy(基于面向对象)
 
  爬取梨视频:|
  1、分析网站的视频源地址
  2、通过requests网视频源地址发送请求
  3、获取视频的二进制流,并保存到本地。
 
 
 
 1 import requests
 2 import re   #   正则模块
 3 
 4 #   对梨视频详情页发生请求,获取响应值
 5 response = requests.get(url='https://www.pearvideo.com/')
 6 print(response.status_code)
 7 print(response.text)
 8 
 9 # re.findall('正则匹配规则','解析文本','正则模式')
10 # re.S:全局模式 (对整个文本进行匹配)
11 # .指的是当前的位置
12 #   *指的是查找所有
13 '''
14 <a href="video_1543373">
15 <a href="video_(.*?)"> #提取所有
16 '''
17 # 获取主页视频详情页ID
18 res = re.findall('<a href="video_(.*?)>"', response.text, re.S)
19 print(res)
20 for m_id in res:
21     #  拼接详情页url
22     detail_url = 'https://www.pearvideo.com/video_'+m_id
23     print(detail_url)
24     import requests
25     import re   #正则模块
26     # uuid.uuid4()  可以根据时间戳生成一段世界上唯一的随机字符串
27     import uuid
28 
29 # 爬虫三部曲
30 
31 # 1.发送请求
32 def get_page(url):
33     response = requests.get(url)
34     return response
35 
36 # 2.解析数据
37 # 解析主页获取视频详情页ID
38 def parse_index(text):
39     res = re.findall('<a href="video_(.*?)"', text, re.S)
40     print(res)
41     detail_url_list = []
42     for m_id in res:
43         # 拼接详情页url
44         detail_url = 'https://www.pearvideo.com/video_'+m_id
45         detail_url_list.append(detail_url)
46     return detail_url_list
47 
48 # 解析详情页获取视频url
49 def parse_detail(text):
50     movie_url = re.findall('srcUrl="(.*?)"', text, re.S)[0]
51     print(movie_url)
52     return movie_url
53 
54 # 保存数据
55 def save_movie(movie_url):
56     response = requests.get(movie_url)
57     # 把视频写到本地
58     with open(f'{uuid.uuid4()}.mp4', 'wb')as f:
59         f.write(response.content)
60         f.flush()
61 if __name__ == '__main__':
62 
63     # 1.对主页发送请求
64     index_res = get_page(url='https://www.pearvideo.com/')
65     # 2.对主页进行解析。获取详情页id
66     detail_url_list = parse_index(index_res.text)
67     print(detail_url_list)
68     # 3.对每个详情页Url发送请求
69     for detail_url in detail_url_list:
70         print(detail_url)
71         detail_res = get_page(url=detail_url)
72         print(detail_res)
73     # 4.解析详情页获取视频url
74         movie_url = parse_detail(detail_res.text)
75         print(movie_url)
76     # 5.保存视频
77         save_movie(movie_url)

异步爬取

 1 import requests
 2 import re
 3 import uuid
 4 from concurrent.futures import ThreadPoolExecutor
 5 pool = ThreadPoolExecutor(50)
 6 
 7 def get_page(url):
 8     print(f'开始异步任务:{url}')
 9     response = requests.get(url)
10     return response
11 def parse_index(res):
12     response = res.result()
13 
14     res = re.findall('<a href="video_(.*?)"', response.text, re.S)
15 
16     for m_id in res:
17         detail_url = 'https://www.pearvideo.com/video_'+m_id
18         pool.submit(get_page,detail_url).add_done_callback(parse_detail)
19 
20 def parse_detail(res):
21     response = res.result()
22     movie_url = re.findall('srcUrl="(.*?)"', response.text, re.S)[0]
23     pool.submit(get_page, movie_url).add_done_callback(save_movie)
24 def save_movie(res):
25     movie_res = res.result()
26 
27     with open(f'{uuid.uuid4()}.mp4', 'wb')as f:
28         f.write(movie_res.content)
29         f.flush()
30 if __name__ == '__main__':
31     url = 'https://www.pearvideo.com/'
32     pool.submit(get_page, url).add_done_callback(parse_index)

 

1 # 访问知乎
2 import requests
3 headers = {
4 'user-agent' :'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36'
5 }
6 response = requests.get(url='https://www.zhihu.com/explore',headers=headers)
7 print(response.status_code)
8 with open('zhihu.html','w',encoding='utf-8')as f:
9      f.write(response.text)

 

爬取豆瓣电影

 1 ''''''
 2 '''
 3 主页:
 4     https://movie.douban.com/top250
 5     GET
 6     User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36
 7     
 8 re正则:
 9     # 电影详情页url、图片链接、电影名称、电影评分、评价人数
10     <div class="item">.*?href="(.*?)">.*?src="(.*?)".*?<span class="title">(.*?)</span>.*?<span class="rating_num".*?>(.*?)</span>.*?<span>(.*?)人评价
11 '''
12 import requests
13 import re
14 url = 'https://movie.douban.com/top250'
15 headers = {
16     'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36'
17 }
18 # 1、往豆瓣TOP250发送请求获取响应数据
19 response = requests.get(url, headers=headers)
20 
21 # print(response.text)
22 
23 # 2、通过正则解析提取数据
24 # 电影详情页url、图片链接、电影名称、电影评分、评价人数
25 movie_content_list = re.findall(
26     # 正则规则
27     '<div class="item">.*?href="(.*?)">.*?src="(.*?)".*?<span class="title">(.*?)</span>.*?<span class="rating_num".*?>(.*?)</span>.*?<span>(.*?)人评价',
28 
29     # 解析文本
30     response.text,
31 
32     # 匹配模式
33     re.S)
34 
35 for movie_content in movie_content_list:
36     # 解压赋值每一部电影
37     detail_url, movie_jpg, name, point, num = movie_content
38     data = f'电影名称:{name},   详情页url:{detail_url}, 图片url:{movie_jpg}, 评分: {point}, 评价人数: {num} \n'
39     print(data)
40 
41     # 3、保存数据,把电影信息写入文件中
42     with open('douban.txt', 'a', encoding='utf-8') as f:
43         f.write(data)

 

 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
posted @ 2019-06-14 13:57  亓呆子  阅读(98)  评论(0编辑  收藏  举报