妹子图数网页爬取

任务:将妹子图首页展示的200多页数据全部爬取下来

  • 在爬取的过程中,需要用到requests库来获取网页
  • 使用bs库来解析网页
  • 随后将图片以图集的形式保存到文件汇总

首先是获取所有图集url的函数

import requests
from bs4 import BeautifulSoup as bs
import threading
import time
import os
def get_base_url():
    """
   获取妹子图的所有图集url,并返回url组成的列表
   """ url_list
= [] for i in range(3,232): url = "https://www.mzitu.com/" + str(i) headers = { "referer":"https://www.mzitu.com/193626", "user-agent":"chrome/10" } rsp = requests.get(url,headers=headers) soup = bs(rsp.text) for i in soup.select("dd"): url = i.a["href"] name = i.text url_list.append((name,url)) return url_list url_list = list(set(get_base_url())) # 对图集去重,发现原本有4000+的url现在只有200+ 大大减少了任务量 print(len(url_list)) for i in url_list: print(i)

随后定义了一个函数来对每一个 url 进行操作

在观察了网页源代码之后,我发现了图集的第一章图的页面构造和以后几张图的页面构造是不一致的,因此我放弃了第一张图的爬取,直接转到获取后面的图片。如果要连同第一张图的图片也都获取下来,只需要加一个 if 语句判定之后构建对应的代码就可以获得整个图集。

def get_img(name,base_url):
    for i in range(2,100):
        url = base_url + "/" +  str(i)
        
        proxies = { "http": "http://111.160.169.54"} 
        headers = {
            "referer":base_url,
            "user-agent":"chrome/10"
        }
        rsp = requests.get(url,headers=headers,proxies=proxies)
        if rsp.status_code == 200:
            soup = bs(rsp.text)
            img_url = soup.select("div.main-image")[0].p.img["src"]
            print(img_url)
            rsp = requests.get(img_url,headers=headers,proxies=proxies)
            path = "meizitu" + "\\" + name
            if not os.path.exists(path):
                os.mkdir(path)

            path = "meizitu" + "\\" + str(name) + "\\" + str(i) + ".png"
            with open(path,"wb+") as f:
                f.write(rsp.content)
        else:
            break

然后就是主函数

url_list = set(url_list)
for i in url_list:
    t = threading.Thread(target=get_img,args=(i[0],i[1],))
    t.start()
    t.join()

这样的话就可以得到所有的图集了

缺陷:

在碰到文件的创建时,总是会出现意料之外的错误,观察下来还是个人对python相关操作的理解不够,然后我选择遇到一个问题就解决一个问题,因此就不花时间去复习原本的内容了。

对文件的操作应该是如下所示

import os
path = "text"
if not os.path.exists(path):
    os.mkdir(path)

这样就可以创建一个文件夹了,但是要注意的是,当你的path字符串是以斜杠结尾的时候,python是会报错的,即使在字符串开头加上了r转义符也是如此,对应的解决办法就是讲斜杠挪出来,单独作为一个字符串加入到员路径字符串中,如此则可。

总结:

  1. 在昨天使用了独创的杨氏编程法之后,获益匪浅,一改之前手忙脚乱的常态,转而成为了一个模块编程的小小小小佬,我哈哈哈哈哈哈哈哈哈哈哈哈。
  2. 但是有时候还是会意气用事,会失去目的,思维短时间内会陷入混乱以至于浪费了时间的同时也延缓了最终程序的构建,着实是一大毛病,是我成长路上的一大绊脚石,是需要着重重视的问题,是能够在编程汇总保持良好心态的关键。希望自己以后能够多加注意,但是不要试图仅凭自己的意志力去抑制思维的发散,还可以适度借助外部工具的力量,比如思维导图;比如带有提示性的信息等等。不一而足。
  3. 哈哈哈哈哈哈哈哈刀哈哈哈哈哈哈哈哈哈诸位告辞。
  4. 要是有哪个小伙伴看到了之后,欢迎给我留言啊!!!!
posted @ 2019-09-27 21:50  明恕而行  阅读(1388)  评论(1编辑  收藏  举报