Python爬虫五天总结

八.总结

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.*?);",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框架

总结:

小有成就,为了深入爬取数据,决定去深入学习一下!

你可能感兴趣的:(python,爬虫)