最近看到有個相對來說比較簡單的可以爬取淘女郎的鏈接地址,它主要可以通過改變URL中page參數來實現翻頁。
我們這個這個鏈接進入到一個淘女郎的頁面,進入相冊頁面,里面有很多相冊,我們打開其中一個,可以發現照片是慢慢加載出來的,打開F12,刷新,過濾出所有的JS請求,然后不斷下拉照片,可以發現也不斷有一些JS請求加載出來,打開response,可以看到里面返回的是json格式的數據,里面就有我們要獲取的圖片的鏈接地址:
分析-01.png
分析-02.png
講上面幾個URL拷貝出來對比一下,并進行簡化,可以看出要想得到圖片的鏈接地址,我們就要構造出含有use_id、album_id、page三個重要參數的URL:
分析-03.png
我們返回到這個淘女郎有所有相冊的這個頁面,同樣F12、刷新,選中XRH,然后點擊下面的翻頁,可以看出有相關的請求加載出來,并且在response中有我們想要的album_id:
分析-04.png
將請求的URL拷貝下來對比一下,并進行簡化,可見要獲得所有相冊的album_id,我們需要構建出含有user_id和page兩個參數的URL(由于還沒有想到如何更好的獲取這個page,所以在后面我就默認page為1,也就是只獲取第一頁相冊頁的內容):
分析-05.png
我們再返回起始頁,F12、刷新在原始的請求里面就有各個淘女郎的信息,我們可以提取到鏈接,然后利用正則就可以將user_id提取出來:
分析-06.png
下面就可以開始寫代碼了:
taobao.py:
from Taonvlang.items import TaonvlangItem
from bs4 import BeautifulSoup
import re
import json
class TaobaoSpider(scrapy.Spider):
Num=1
name = 'taobao'
# allowed_domains = ['www.taobao.com']
def start_requests(self):
urls=['https://mm.taobao.com/json/request_top_list.htm?page={}'.format(i) for i in range(1,2)]
for url in urls:
yield scrapy.Request(url,callback=self.parse_user_id)
def parse_user_id(self, response):
urls=response.css('.list-item .personal-info .pic-word .top a::attr(href)').extract()
user_ids=[url.split('=')[-1] for url in urls if url]
for user_id in user_ids:
url='https://mm.taobao.com/self/album/open_album_list.htm?_charset=utf-8&user_id%20={}&page=1'.format(user_id)
yield scrapy.Request(url,meta={'user_id':user_id},callback=self.parse_album_id)
def parse_album_id(self, response):
user_id=response.meta.get('user_id')
if response.status==200:
html=response.text
soup=BeautifulSoup(html,'lxml')
results=soup.select('.mm-photo-list.clearfix .mm-photo-cell')
for result in results:
link=result.select('.mm-photo-cell-middle h4 a')[0]['href']
album_id=re.search('album_id=(.*?)&',link).group(1)
page_content=result.select('.mm-photo-cell-middle .mm-pic-number')[0].text
pages=int(re.findall('\d+',page_content)[0])
for page in range(1,int(pages/16)+2):
print('開始處理用戶:{},相冊編號:{},第{}頁,#{}'.format(user_id,album_id,page,self.Num))
self.Num=self.Num+1
url='https://mm.taobao.com/album/json/get_album_photo_list.htm?user_id='+str(user_id)+'&album_id='+str(album_id)+'&page='+str(page)
yield scrapy.Request(url,callback=self.parse)
def parse(self,response):
item=TaonvlangItem()
html=response.text
contents=json.loads(html)
piclists=contents.get('picList')
for piclist in piclists:
item['user_id'] = piclist.get('userId')
item['album_id'] = piclist.get('albumId')
item['title']=piclist.get('des')
item['picurl']='http:'+piclist.get('picUrl').replace('_290x10000','_620x10000')
yield item
settings.py:
BOT_NAME = 'Taonvlang'
SPIDER_MODULES = ['Taonvlang.spiders']
NEWSPIDER_MODULE = 'Taonvlang.spiders'
MONGO_URI='localhost'
MONGO_DB='taonvlang'
ROBOTSTXT_OBEY = False
DOWNLOAD_DELAY = 0.5
COOKIES_ENABLED = False
DEFAULT_REQUEST_HEADERS = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language': 'en',
'user-agent':'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36',
'cookie':'tracknick=tb4192332_2012; _cc_=U%2BGCWk%2F7og%3D%3D; tg=0; UM_distinctid=15dbfe52514207-04b2f5bc0dad73-5c6a3a7a-100200-15dbfe52516189; miid=1819893462062305719; hng=CN%7Czh-CN%7CCNY%7C156; thw=cn; x=e%3D1%26p%3D*%26s%3D0%26c%3D0%26f%3D0%26g%3D0%26t%3D0%26__ll%3D-1%26_ato%3D0; CNZZDATA30063598=cnzz_eid%3D1240630502-1506404882-https%253A%252F%252Fmm.taobao.com%252F%26ntime%3D1506410623; mt=ci%3D-1_0; v=0; cookie2=1f2c6d580c0f148fbc23e44a72de8f8f; t=161b12068ebd1c81ad307468bd85c61c; _tb_token_=51e38b59445f8; CNZZDATA30064598=cnzz_eid%3D1465862291-1506410103-https%253A%252F%252Fmm.taobao.com%252F%26ntime%3D1506497588; CNZZDATA30063600=cnzz_eid%3D657822935-1506407601-https%253A%252F%252Fmm.taobao.com%252F%26ntime%3D1506497588; cna=KHPKEQF/owQCAd5P091TEN2z; isg=AqWlkF1UEG9PMHRxJxBdyAqptGGxCilIDLs31KeKYVzrvsUwbzJpRDNePhQz; JSESSIONID=94615D4E06F9128BD591C9C4B3A69B13; uc1=cookie14=UoTcCfQsoQo68g%3D%3D'
}
ITEM_PIPELINES = {
'Taonvlang.pipelines.MyImagesPipeline':1,
'Taonvlang.pipelines.MongoPipeline': 300,
}
IMAGES_STORE='E:\python\Pycharm\Taonvlang'
IMAGES_EXPIRES=90
IMAGES_THUMBS={
'small':(50,50),
'big':(200,200),
}
這個是最終的運行結果:
運行-01.png
這是下載下來的淘女郎的照片(此處若有涉及侵權我將第一時間刪除):
000be1f0aa019cbe8e92869a5c03df3aca5cb99d.jpg
0b05048c75b5adb2061d303092e84504fe73a0a7.jpg
存在的問題:
1、代碼中有好幾個地方還是可以再完善一下的
2、寫代碼中還是會出現卡殼的情況,有些地方還不是運用的很熟練
3、還是要多學新知識、運用新知識來解決問題