博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

requests之’糗事百科‘页面数据抓取

Posted on 2019-03-14 14:32  TigerAt  阅读(226)  评论(0)    收藏  举报
 1 #!/usr/bin/env python
 2 #_*_coding:utf-8_*_
 3 #Author:Tiger At
 4 #此代码用于“糗事百科相关”一定页码范围的html页面抓取,仅供娱乐和学习
 5 
 6 #导入requests模块用于进行数据爬取,os模块用于创建文件夹
 7 import requests,os
 8 
 9 #此字典用于存储“糗事百科”中相关版块按钮信息
10 sections = {
11     "热门":'8hr',
12     "24小时":'hot',
13     "热图":'imgrank',
14     "文字":'text',
15     "穿越":'history',
16     "糗图":'pic',
17     "新鲜":'textnew'
18 }
19 
20 #此方法用于显示版块信息
21 def show_section():
22     for i in sections:
23         print(i,end='\t') #以制表符结尾 方便版块信息的横向显示
24 
25 
26 #此方法用于根据用户所输入的信息进行相关版块url的提取及文件夹的创建
27 def handle_input():
28     while True:
29         show_section()
30         section = input("\n请输入所要爬取的版块信息(退出q):")
31         if section == 'q':
32             return 'q'
33 
34         # 判断用户输入的信息是否存在相关版块内,如果存在则进行后续操作
35         elif section in sections:
36             # 获取当前程序所在路径,还有一种方式是直接写当前目录无需获取但会偶发性报错('./文件夹名称')不建议使用
37             current_path = os.path.abspath('.')
38             # 在当前程序文件所在目录下创建新目录:
39             conf_dir = os.path.join(current_path, section)  # 构造新的路径
40             if not os.path.exists(conf_dir):  # 判断目录是否存在,如果不存在则创建
41                 os.mkdir(conf_dir)  # 创建目录
42             url = 'https://www.qiushibaike.com/%s/' % (sections[section])
43             return url,section
44 
45 #此方法用于数据的抓取
46 def grab(url,section):
47     #用户输入抓取的起始页码
48     start_num = int(input("请输入要抓取的起始页码:"))
49     end_num = int(input("请输入要抓取的起始页码:"))
50     #自定义UA请求头信息
51     headers = {
52         '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'
53     }
54     # 获取响应中的页面数据
55     for i in range(start_num,end_num+1):
56         print(url + 'page/%s/' % str(i))
57         #发送请求
58         response = requests.get(url = url + 'page/%s/' % str(i),headers = headers)
59         #获取数据
60         page_text = response.text
61         #指定文件路径(即handle_input()所创建的目录下)
62         file_path = './%s/' % section + str(i) + '.html'
63 
64         #进行数据的持久化存储
65         with open(file_path,'w',encoding='utf-8') as fb:
66             fb.write(page_text)
67             print("第%d页写入数据完成")
68 
69 
70 if __name__ == '__main__':
71     url,section = handle_input()
72     if url == 'q':
73         exit()
74     else:
75         grab(url,section)

 上面的代码仅仅是用来获取对应页面数据信息,并将此页面信息进行下载,但并未将页面信息进行解析,从而无法得到我们想要的“重要信息”

其实,爬虫的最主要流程包括:

1) 指定url
2) 发起请求
3) 获取页面数据
4) 数据解析
  - 正则
  - bs4
  - xpath
5) 持久化存储

下面我们就针对“糗事百科“中的的”糗图”的具体图片做对应代码的演示:

经过我们分析“糗事百科”中的“糗图”页面中的源码得知,有关存储图片的HTML代码如下:

<div class="thumb">

<a href="/article/121629843" target="_blank">
<img src="//pic.qiushibaike.com/system/pictures/12162/121629843/medium/CTUBDQNIFJWSYHCK.jpg" alt="牛皮">
</a>

</div>

因此我们使用正则表达式:<div class="thumb">.*?<img src="(.*?)".*?>.*?</div> 取出如上标红的连接并加上"https:"字符串进行相应二进制文件的获取和存储即可,具体代码如下:

 1 #创建一个存储图片的数据的文件夹
 2         if not os.path.exists('./imags'):
 3             os.mkdir('./imags')
 4         for img_url in img_list:
 5             #将图片的url进行拼接,拼接成一个完整的url
 6             img_url = "https:" + img_url
 7             #持久化存储:存储的是图片数据,并不是url
 8             #获取图片二进制的数据值
 9             img_data = requests.get(img_url,headers = headers).content
10             img_name = img_url.split('/')[-1]
11             imag_path = './imags/' + img_name
12             with open(imag_path,'wb') as fb:
13                 fb.write(img_data)
14                 print(img_name+"写入成功")