说在前面的话
第一次在网络上记录自己对一个软件的学习,有些激动。同时也表明自己对Python软件学习的兴趣,持久的兴趣。我是学包装的,虽然以前有过C,matlab等编程语言的一小丁点基础(你知道的,就是在大学里面工科学的那些),但看到大家对Python强大功能的介绍,不知不觉的也在幻想自己哪天可可以做到数据分析、挖掘,人工智能等。而通过在这几天的学习后,觉得还是先定个小目标然后再考虑那么高精尖的领域。所以我的小目标就是:想拿到什么数据就可以拿到什么数据。
好吧,废话就不多说了,步入正题:爬取淘宝MM图片并存入本地电脑。先展示一下成果。
心动了吧?那我们就开始吧。
爬取思路:
首先:获取MM列表页中的MM个人链接,只有这样才可以分别爬取每个MM的照片。
其次:得到MM个人页面链接后,爬取个人页面上图片并按MM姓名创建文件夹保存图片。
思路简单、清晰。这个非常重要!
爬取工具:基于Pycharm IDE,利用Anaconda3中的库以及Python 3.6,BS4, selenium
开始了:
注意:所有文本中代码以斜体表示
链接打开可以看到是这样的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后回车,就会看到一行行的白条进度,然后完成。
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
由于时间有限,无法就具体的操作做进一步说明。另外此代码只是把事情做完了,但其实还有很多需要优化的地方,欢迎个人提供优化建议。