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

说在前面的话

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


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

爬取到本地的MM图片

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

爬取思路:

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

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

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

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

开始了:

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

MM列表链接: https://mm.taobao.com/search_tstar_model.htm?spm=5679.126488.640745.2.11e87dd18xwW8K&style=&place=city%3A

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

MM列表页

作为菜鸟(以廖先生的教程入门: https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000),刚开始试图采用BS4以及requests来抓取页面,可倒腾了半天发现保存图片链接的list总是为空。经过反复确认程序没有出错后(你懂的,菜鸟总是会是不是的弄错缩进,少个:号,弄错select关键词等等),才发现原来抓取下来的页面不完整:根本没有MM列表部分的代码,尽管用Chrome查看源代码时这些都存在的。于是就在网络上狂搜索类似问题做各种尝试,比如加UserAgent,转换编码器(lxml,gbk等)但还是不行,翻墙到外网也没有找到答案。终于在一个Python学习群中有人建议用selenium试试,因为这个页面是动态加载而非静态的。于是就继续尝试用selenium。经过几番失败后,终于抓取了完整MM列表页。

selenium安装:

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

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

Selenium 安装

2. 安装浏览器插件。
从如下网站下载相对于的浏览器插件。https://pypi.python.org/pypi/selenium 由于我使用的是Firefox,所以以firefox举例。

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()
driver.get('https://mm.taobao.com/search_tstar_model.htm?spm=5679.126488.640745.2.11e87dd18xwW8K&style=&place=city%3A')
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

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,117评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,963评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,897评论 0 240
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,805评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,208评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,535评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,797评论 2 311
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,493评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,215评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,477评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,988评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,325评论 2 252
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,971评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,807评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,544评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,455评论 2 266

推荐阅读更多精彩内容