最近看到有个相对来说比较简单的可以爬取淘女郎的链接地址,它主要可以通过改变URL中page参数来实现翻页。
我们这个这个链接进入到一个淘女郎的页面,进入相册页面,里面有很多相册,我们打开其中一个,可以发现照片是慢慢加载出来的,打开F12,刷新,过滤出所有的JS请求,然后不断下拉照片,可以发现也不断有一些JS请求加载出来,打开response,可以看到里面返回的是json格式的数据,里面就有我们要获取的图片的链接地址:
讲上面几个URL拷贝出来对比一下,并进行简化,可以看出要想得到图片的链接地址,我们就要构造出含有use_id、album_id、page三个重要参数的URL:
我们返回到这个淘女郎有所有相册的这个页面,同样F12、刷新,选中XRH,然后点击下面的翻页,可以看出有相关的请求加载出来,并且在response中有我们想要的album_id:
将请求的URL拷贝下来对比一下,并进行简化,可见要获得所有相册的album_id,我们需要构建出含有user_id和page两个参数的URL(由于还没有想到如何更好的获取这个page,所以在后面我就默认page为1,也就是只获取第一页相册页的内容):
我们再返回起始页,F12、刷新在原始的请求里面就有各个淘女郎的信息,我们可以提取到链接,然后利用正则就可以将user_id提取出来:
下面就可以开始写代码了:
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),
}
这个是最终的运行结果:
这是下载下来的淘女郎的照片(此处若有涉及侵权我将第一时间删除):
存在的问题:
1、代码中有好几个地方还是可以再完善一下的
2、写代码中还是会出现卡壳的情况,有些地方还不是运用的很熟练
3、还是要多学新知识、运用新知识来解决问题