您的当前位置:首页Python爬虫--爬取淘宝MM图片

Python爬虫--爬取淘宝MM图片

2024-12-13 来源:哗拓教育

说在前面的话

第一次在网络上记录自己对一个软件的学习,有些激动。同时也表明自己对Python软件学习的兴趣,持久的兴趣。我是学包装的,虽然以前有过C,matlab等编程语言的一小丁点基础(你知道的,就是在大学里面工科学的那些),但看到大家对Python强大功能的介绍,不知不觉的也在幻想自己哪天可可以做到数据分析、挖掘,人工智能等。而通过在这几天的学习后,觉得还是先定个小目标然后再考虑那么高精尖的领域。所以我的小目标就是:想拿到什么数据就可以拿到什么数据。


好吧,废话就不多说了,步入正题:爬取淘宝MM图片并存入本地电脑。先展示一下成果。

爬取到本地的MM图片

心动了吧?那我们就开始吧。

爬取思路:

首先:获取MM列表页中的MM个人链接,只有这样才可以分别爬取每个MM的照片。

其次:得到MM个人页面链接后,爬取个人页面上图片并按MM姓名创建文件夹保存图片。

思路简单、清晰。这个非常重要!

爬取工具:基于Pycharm IDE,利用Anaconda3中的库以及Python 3.6,BS4, selenium

开始了:

注意:所有文本中代码以斜体表示

链接打开可以看到是这样的MM列表。

MM列表页

selenium安装:

1.selenium Window 安装很简单,方法如下:

调出doc运行窗口,输入pip install selenium后回车,就会看到一行行的白条进度,然后完成。

Selenium 安装

firefox对应的是geckodriver,下载解压后,将解压后的文件存放入firefox的安装目录下C:\Program Files\Mozilla Firefox以及Python的安装目录下我的是C:\Users\xxxxx\AppData\Local\Programs\Python\Python35\selenium\webdriver\firefox.

然后将这两个路径加入系统环境变量中。这里就不详述请找度娘。记住此处需要重启电脑。

安装完成后,在Pycharm中输入from sel时就会自动联想出selenium.这样你就设置好了。

获取MM列表页

代码如下:

from bs4 import BeautifulSoup
from selenium import webdriver
from sub_page_parse import sub_page_parse

#  collected links from main page by using selenium
url_list = []
hyper_link_list = []
driver = webdriver.Firefox()

html = driver.page_source
driver.quit()
soup = BeautifulSoup(html, 'lxml')

你可以用print(soup)检查是否所有的内容被抓取出来,尤其是MM个人页面链接。

接下来就是从拿到的内容里找到MM个人页链接,并打印查看。

rls = soup.select(r'#J_GirlsList > li > a > div > div.img > img')
hyper_links = soup.select('a.item-link')

for url,hyper_link in zip(urls,hyper_links):
    url = 'https:'+url.get('src')
    hyper_link = 'https:'+hyper_link.get('href')
    url_list.append(url)
    hyper_link_list.append(hyper_link)
# print out all sub pages get from main page
print(hyper_link_list)

接下来就是爬取MM个人页面图片:

for link in hyper_link_list:
    sub_page_parse(link)

sub_page_parse 函数:

import re
from bs4 import BeautifulSoup
import requests
import urllib.request
import time
from mkdir import mkdir
import os


# get images from sub-pages
def sub_page_parse(url):
    time.sleep(3)
    src_list=[]
    src_list_raw = []
    wb_data = requests.get(url)
    soup = BeautifulSoup(wb_data.text, 'lxml')
    imgs_list = soup.select('img')
    print(imgs_list)

    for img_src in imgs_list:
        img_src = img_src.get('src')
        src_list_raw.append(img_src)
# remove any emply and None value in list
    src_list_0 = [i_src for i_src in src_list_raw if i_src not in ['', ',', None]]
# pick up
    for src, i in zip(src_list_0,range(1,len(src_list_0)+1)):
        #if img_src == None:
        #    imgs_list.pop(i-1)
        #img_src = re.sub('\s','', img_src)
        # print(img_src)
        regex = '^/{2}.*\.(jpg|gif)$'
        match = re.search(regex, src)
        if match:
            result = match.group()
            print(src)
            src_list.append(result)


    while '' in src_list:  # remove any emply cell in list
        src_list.remove('')
    print(src_list)

    model_name = soup.select('div.mm-p-left > div > div.mm-p-model-info-left > div.mm-p-model-info-left-top > dl > dd > a')[0].text

    path_1 = "C:\\Users\\jj\\Documents\\My Data\\Python_study\\imgs"
    path_2 = "\\" + model_name
    path_0 = path_1 + path_2
    mkdir(path_0)

    for link,i in zip (src_list, range(1,len( src_list))):
        link = 'https:'+link  # remove table sign, backspace and enter at one time
        # print(link)
        filename = '\\'+ str( i)+ '.jpg'

        try:
            if os.path.exists((path_0+ filename)):
                print('File exist!\n')
            else:
                urllib.request.urlretrieve(link, path_0 + filename)
        except:
            continue
            # print(filename.lstrip("\\")+' created!\n')

mkdir函数:

import os

def mkdir(path):
    # 引入模块
    #import os
    # 去除首位空格
    path = path.strip()
    # 去除尾部 \ 符号
    path = path.rstrip("\\")

    # 判断路径是否存在
    # 存在    True
    # 不存在  False
    isExists = os.path.exists(path)

    # 判断结果
    if not isExists:
        # 如果不存在则创建目录
    # 创建目录操作函数
        os.makedirs(path)

        print(path + ' 创建成功')

    else:
        # 如果目录存在则不创建,并提示目录已存在
        print(path + ' 目录已存在')
    return True

由于时间有限,无法就具体的操作做进一步说明。另外此代码只是把事情做完了,但其实还有很多需要优化的地方,欢迎个人提供优化建议。

最后:请注意避免频繁爬取以上网页以免造成不利影响。

显示全文