爬虫入门(三)——动态网页爬取:爬取pexel上的图片

释放双眼,带上耳机,听听看~!

Pexel上有大量精美的图片,没事总想看看有什么好看的自己保存到电脑里可能会很有用

但是一个一个保存当然太麻烦了

所以不如我们写个爬虫吧(๑•̀ㅂ•́)و✧

一开始学习爬虫的时候希望爬取pexel上的壁纸,然而自己当时不会

上周好不容易搞出来了,周末现在认真地总结一下上周所学的内容

也希望自己写的东西可以帮到爬虫入门滴朋友!

 

Before

同样的,我们在写一个爬虫前要明确自己想要爬取的东西是什么,明确下载目标数据在浏览器的操作如何

对于动态网页的爬取,在网页地址不变的情况下,我们首先要明确如何获取AJAX请求

首先我们看看这个网站pexel

打开页面后再Chrome浏览器中选择“更多工具”→“开发者工具”→“Network”→XHR

1、看到Name那一栏中,找到每一次鼠标下滑浏览器发出的请求,任意点开一个请求;

2、在右侧的Headers下拉

3、找到Query String Parameter这一栏,记住这里的数据

等下用于构造请求

 

接下来,在脑海里明确一下下载图片的步骤

我们首先点开一张图(要获得这个图的地址)→选择下载图片→获得一个.jpeg结尾或者.png结尾的网页,最后保存图片

查看网页源代码可以发现在每一次动态生成的页面中我们就可以直接获取图的下载地址

找到它,发现前缀是\"https://images.pexels.com/photos/\"+jpeg或者png




这时候我们可以考虑到,首先我们先获得页面的代码
然后通过正则表达式去搜索符合条件的图片
但是后面可能会有重复的地方,在获取的list中最后再用set筛选一下即可。
明确上述思路后,接下来我们开始构建爬虫

①初始化Headers☆
这一步非常重要,不构造headers会被禁止访问= =
headers初始化代码如下,用于将爬虫伪装成浏览器请求,而请求用于出发特定的AJAX内容
1 headers = { 2     \'User-Agent\':\'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36\'
3 
4 } 5 url=\"https://www.pexels.com/\"

②构造动态AJAX请求
根据上述截图中保存的Query String Parameter参数,我们构造request请求的时候捎上Params内容
把获取的下载图片的link保存到一个list中
 1 def get_next_page ():  2     # ulist = []
 3     pic_data_list = []  4     for i in range(1,100): # 构造动态访问请求,注意那个seed最好就是和当下时间相近的时间,可以直接打开网页copy一个来
 5         try:  6             r=requests.get(url,params={\'format\': \'js\',\'seed\':\'2019-04-20+07:55:52++0000\',\'dark\': \'true\',\'page\': i,\'type\':\'\'},headers=headers,timeout = 0.5)  7 
 8             print(\'the %s page is analyzing\' % i)  9 
10             pattern = re.compile(r\'.*?https://images.pexels.com/photos/(.*?).jpeg.*?\') 11             pic_list = re.findall(pattern,r.text) 12  pic_data_list.extend(pic_list) 13 
14         except: 15             pass
16 
17     return pic_data_list

③元素的筛选
一开始调试程序的时候发现获取的link中还有以png形式结尾的link,这里需要再对list进行二次筛选,保留可以下载图片的link
最后还别忘了使用set把list中重复的元素删去哦
 1 list_content=get_next_page()  2 list_content=list(set(list_content))  3 pattern = re.compile(r\'.*?/pexels-photo-(.*?).png.*?\')  4 
 5 for i in range(len(list_content)):  6     if(re.search(pattern,list_content[i])):  7         list_content[i]=re.search(pattern,list_content[i]).group()  8     else:  9         list_content[i]=list_content[i]+\'.jpeg\'
10 
11 list_content=list(set(list_content))


④最后对于保存了每一张图片的下载地址的list使用urllib.request.urlretrieve把图片保存到指定路径就可以啦
*pexel一开始还对每个图片的下载地址整了反爬虫机制,所以下载也要再构造一次headers模拟浏览器^_^
这一步可以单独写成一个函数,不过我贪方便就没这么写
 1 x=1
 2 for i in list_content:  3 
 4     try:  5         url1 = \"https://images.pexels.com/photos/\"+i  6         opener = urllib.request.build_opener()  7         opener.addheaders = [(\'User-Agent\',\'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36\')]  8  urllib.request.install_opener(opener)  9         request.urlretrieve(url1,\"E://walkingbug/PAGE2/%r.jpg\" % x) 10         print(\"the %s is downloaded.\" % url1) 11         x+=1
12     except error.HTTPError as e: 13         print(e.reason) 14     except error.URLError as e: 15         print(e.reason) 16     except: 17         pass

 


 

最后贴两张运行结果图

控制台的输出:

下载到本地的壁纸

完整代码如下:
①为了调试程序中间加了一些输出语句
②如果要粘去直接用,记得通过打开页面查看query string parameter修改23行代码的seed内容!不然可能会爬不到东西
 1 import lxml.html  2 import requests  3 from urllib import request,error  4 import urllib  5 import re  6 
 7 import time #用于爬取计时,后面不用也可以
 8 
 9 headers = { 10     \'User-Agent\':\'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36\'
11 
12 } 13 url=\"https://www.pexels.com/\"
14 
15 searched_url=[] 16 start_time = time.time() 17 
18 def get_next_page (): 19     # ulist = []
20     pic_data_list = [] 21     for i in range(1,100): # 构造动态访问请求,注意那个seed最好就是和当下时间相近的时间,可以直接打开网页copy一个来
22         try: 23             r=requests.get(url,params={\'format\': \'js\',\'seed\':\'2019-04-20+07:55:52++0000\',\'dark\': \'true\',\'page\': i,\'type\':\'\'},headers=headers,timeout = 0.5) 24 
25             print(\'the %s page is analyzing\' % i) 26 
27             pattern = re.compile(r\'.*?https://images.pexels.com/photos/(.*?).jpeg.*?\') 28             pic_list = re.findall(pattern,r.text) 29  pic_data_list.extend(pic_list) 30 
31         except: 32             pass
33 
34     return pic_data_list 35 
36 list_content=get_next_page() 37 list_content=list(set(list_content)) 38 pattern = re.compile(r\'.*?/pexels-photo-(.*?).png.*?\') 39 
40 for i in range(len(list_content)): 41     if(re.search(pattern,list_content[i])): 42         list_content[i]=re.search(pattern,list_content[i]).group() 43     else: 44         list_content[i]=list_content[i]+\'.jpeg\'
45 
46 list_content=list(set(list_content)) 47 for i in list_content: 48     print(i) 49 print(len(list_content)) 50 
51 x=1
52 for i in list_content: 53 
54     try: 55         url1 = \"https://images.pexels.com/photos/\"+i 56         opener = urllib.request.build_opener() 57         opener.addheaders = [(\'User-Agent\',\'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36\')] 58  urllib.request.install_opener(opener) 59         request.urlretrieve(url1,\"E://walkingbug/PAGE2/%r.jpg\" % x) 60         print(\"the %s is downloaded.\" % url1) 61         x+=1
62     except error.HTTPError as e: 63         print(e.reason) 64     except error.URLError as e: 65         print(e.reason) 66     except: 67         pass

 




人已赞赏
随笔日记

Spinner之下拉多选,监听ID后显示不同Frgment页面

2020-11-9 4:30:27

随笔日记

解决vs2019中暂时无法为.net core WinForms使用 Designer 的临时方法

2020-11-9 4:30:29

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索