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+"写入成功")
要有最最遥远的梦想
和最最朴素的生活
即使明日天寒地冻
路遥马亡
浙公网安备 33010602011771号