八.总结
1.完整项目练习
爬取壁纸分类中”全部“的前10页所有组图。
import requests
import re
import json
from lxml import etree
from concurrent.futures import ThreadPoolExecutor
#该函数负责获取到每一个详情页href
def get_detial_href(url):
#准备域名
string = "https://desk.zol.com.cn"
resp = requests.get(url)
resp.encoding = "gbk"
et = etree.HTML(resp.text)
hrefs = et.xpath("//ul[@class='pic-list2 clearfix']/li/a/@href")
#处理一下href,添加域名
new_hrefs = []
for href in hrefs:
if href=='https://file.cdn.cqttech.com/xzdesktop/XZDesktop_4020_2.0.12.22.exe':
continue
new_hrefs.append(string+href)
#print(new_hrefs)
return new_hrefs
#访问每一个详情页,得到每个详情页背后对应的一组图片下的路径
def get_img_src(href):
resp = requests.get(href)
resp.encoding = "gbk"
obj = re.compile(r"var deskPicArr.*?=(?P<desk_str>.*?);",re.S)
#提取页面中有用信息
result = obj.search(resp.text).group("desk_str")
# 把类似字典的字符串变成字典——使用json
deskPic = json.loads(result)
img_src_list = []
for item in deskPic['list']:
oriSize = item.get("oriSize")
imgsrc = item.get("imgsrc")
imgsrc = imgsrc.replace("##SIZE##", oriSize)
# print(imgsrc)
img_src_list.append(imgsrc)
return img_src_list
#下载函数
def download_img(imgsrc):
name = imgsrc.split("/")[-1]
print(f"开始下载{name}")
# 发送网络请求
resp_img = requests.get(imgsrc)
# 此时拿不到resp.text,利用resp.content拿到的是字节
with open(f"picture/{name}", mode="wb") as f:
f.write(resp_img.content)
print(f"{name}下载完毕")
def main():
for i in range(1,10):
url = "https://desk.zol.com.cn/pc/"
if i!=1:
url = url+f"{i}.html"
#抓取到首页中每个详情页的href
print("抓取到首页中每个详情页的href......")
hrefs = get_detial_href(url)
#print(hrefs)
print("访问每一个详情页,得到每一个详情页中的一组图片......")
#储存所有图片下载地址
img_list = []
for href in hrefs:
#访问每一个详情页,得到每一个详情页中的一组图片
imgsrc_list = get_img_src(href)
for img in imgsrc_list:
img_list.append(img)
#开始下载——创建线程池
with ThreadPoolExecutor(20) as t:
for img in img_list:
t.submit(download_img,img)
print("All over!!!")
break
#主函数
if __name__ == '__main__':
main()
2.总结
学习内容:
- requests模块
- 正则表达式,re模块
- xpath(注意区分re,xpath使用场景)
- 多线程,线程池
不足:
- 反爬
- 其他的解析方式
- 协程(弥补线程的不足,提高线程的利用率)
- js逆向
- 加密&解密
- http协议,请求全过程等等
- scrapy框架
总结:
小有成就,为了深入爬取数据,决定去深入学习一下!