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 筛选一下即可.
明确上述思路后, 接下来我们开始构建爬虫
1初始化 Headers☆
这一步非常重要, 不构造 headers 会被禁止访问 = =
headers 初始化代码如下, 用于将爬虫伪装成浏览器请求, 而请求用于出发特定的 Ajax 内容
2构造动态 Ajax 请求
根据上述截图中保存的 Query String Parameter 参数, 我们构造 request 请求的时候捎上 Params 内容
把获取的下载图片的 link 保存到一个 list 中
- def get_next_page ():
- # ulist = []
- pic_data_list = []
- for i in range(1,100): # 构造动态访问请求, 注意那个 seed 最好就是和当下时间相近的时间, 可以直接打开网页 copy 一个来
- try:
- 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)
- print('the %s page is analyzing' % i)
- pattern = re.compile(r'.*?https://images.pexels.com/photos/(.*?).jpeg.*?')
- pic_list = re.findall(pattern,r.text)
- pic_data_list.extend(pic_list)
- except:
- pass
- return pic_data_list
3元素的筛选
一开始调试程序的时候发现获取的 link 中还有以 PNG 形式结尾的 link, 这里需要再对 list 进行二次筛选, 保留可以下载图片的 link
最后还别忘了使用 set 把 list 中重复的元素删去哦
- list_content=get_next_page()
- list_content=list(set(list_content))
- pattern = re.compile(r'.*?/pexels-photo-(.*?).png.*?')
- for i in range(len(list_content)):
- if(re.search(pattern,list_content[i])):
- list_content[i]=re.search(pattern,list_content[i]).group()
- else:
- list_content[i]=list_content[i]+'.jpeg'
- list_content=list(set(list_content))
4最后对于保存了每一张图片的下载地址的 list 使用 urllib.request.urlretrieve 把图片保存到指定路径就可以啦
*pexel 一开始还对每个图片的下载地址整了反爬虫机制, 所以下载也要再构造一次 headers 模拟浏览器 ^_^
这一步可以单独写成一个函数, 不过我贪方便就没这么写
- x=1
- for i in list_content:
- try:
- url1 = "https://images.pexels.com/photos/"+i
- opener = urllib.request.build_opener()
- 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')]
- urllib.request.install_opener(opener)
- request.urlretrieve(url1,"E://walkingbug/PAGE2/%r.jpg" % x)
- print("the %s is downloaded." % url1)
- x+=1
- except error.HTTPError as e:
- print(e.reason)
- except error.URLError as e:
- print(e.reason)
- except:
- pass
最后贴两张运行结果图
控制台的输出:
下载到本地的壁纸
完整代码如下:
1为了调试程序中间加了一些输出语句
2如果要粘去直接用, 记得通过打开页面查看 query string parameter 修改 23 行代码的 seed 内容! 不然可能会爬不到东西
import lxml.HTML
- import requests
- from urllib import request,error
- import urllib
- import re
- import time #用于爬取计时, 后面不用也可以
- headers = {
- 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36'
- }
- url="https://www.pexels.com/"
- searched_url=[]
- start_time = time.time()
- def get_next_page ():
- # ulist = []
- pic_data_list = []
- for i in range(1,100): # 构造动态访问请求, 注意那个 seed 最好就是和当下时间相近的时间, 可以直接打开网页 copy 一个来
- try:
- 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)
- print('the %s page is analyzing' % i)
- pattern = re.compile(r'.*?https://images.pexels.com/photos/(.*?).jpeg.*?')
- pic_list = re.findall(pattern,r.text)
- pic_data_list.extend(pic_list)
- except:
- pass
- return pic_data_list
- list_content=get_next_page()
- list_content=list(set(list_content))
- pattern = re.compile(r'.*?/pexels-photo-(.*?).png.*?')
- for i in range(len(list_content)):
- if(re.search(pattern,list_content[i])):
- list_content[i]=re.search(pattern,list_content[i]).group()
- else:
- list_content[i]=list_content[i]+'.jpeg'
- list_content=list(set(list_content))
- for i in list_content:
- print(i)
- print(len(list_content))
- x=1
- for i in list_content:
- try:
- url1 = "https://images.pexels.com/photos/"+i
- opener = urllib.request.build_opener()
- 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')]
- urllib.request.install_opener(opener)
- request.urlretrieve(url1,"E://walkingbug/PAGE2/%r.jpg" % x)
- print("the %s is downloaded." % url1)
- x+=1
- except error.HTTPError as e:
- print(e.reason)
- except error.URLError as e:
- print(e.reason)
- except:
- pass
来源: https://www.cnblogs.com/AKsnoopy/p/10741719.html