scrapy抓取淘宝女郎

scrapy抓取淘宝女郎

准备工作

  • 首先在淘宝女郎的首页这里查看,当然想要爬取更多的话,当然这里要查看翻页的url,不过这操蛋的地方就是这里的翻页是使用javascript加载的,这个就有点尴尬了,找了好久没有找到,这里如果有朋友知道怎样翻页的话,麻烦告诉我一声,谢谢了...,不过就这样坐以待毙了吗,所以就在chrome上搜,结果看到有人直接使用的这个网页,我当时一看感觉神奇的样子,这就是简化版的首页啊,只需要改变page的数字就可以实现遍历了,不过还是有点小失落,为什么人家就能找到呢,这个我还是希望知道的朋友能够分享一下,我也会查看相关的资料,把这个空缺不上的,好了,现在开我们的工作了

  • 我们的目的是抓取册以及相关的信息,所以我们需要随便打开一个淘女郎的相册页面,然后随便进入一个相册即可,很显然这里的相册是异步加载的,因此我们需要抓包,这里我抓到了含有相册的url以及相关信息的json数据,如下图:

相册数据

  • 然后我们查看它的url为https://mm.taobao.com/album/j...

  • 通过我尝试之后这条url可以简化为:

  • https://mm.taobao.com/album/j...{0}&album_id={1}&top_pic_id=0&page={2}&_ksTS=1493654931946_405

  • 其中user_id是每一个女郎对的id,ablum_id时每一个相册的id,这里一个女郎有多个相册,因此这个id是不同的,但是page就是要翻页的作用了,可以看到我去掉了callback=json155这一项,因为如果加上这一项,返回的数据就不是json类型的数据,其中page是在抓包的时候点击翻页才会在下面出现的,可以看到同一个相册返回的除了page不同之外,其他的都是相同的,因此这里通过page来实现翻页的数据

  • 上面分析了每一个相册的url数据的由来,可以看到我们下面需要找到user_id,ablum_id这两个数据.

  • user_id的获取:我们打开首页,然后打开chrome的调试工具,可以看到每一个 女郎的url中都包含user_id这一项,因此我们只需要通过这个实现翻页然后获取每一个女郎的url,之后用正则将user_id匹配出来即可,代码如下

ps=response.xpath('//p[@class="top"]')for p in ps:item=JrtItem()href=p.xpath('a/@href').extract()   #这个得到的是一个数组urlif href:item['user_id']=self.pattern_user_id.findall(href[0])[0]   #用则正匹配出user_id,其中的正则为  pattern_user_id=re.compile(r'user_id=(\d+)')
  • ablum_id的获取:想要获取ablum_id当然要在相册的页面查找,于是我们在相册页面抓包获得了如下图的页面

ablum_id

  • 通过上图我们清晰的知道每一个相册的里面包含多少相册,但最令人开心的是在这个页面中不是动态加载,因此我们可以查看它的源码,当我们查看源码的时候,我们可以看到和user_id一样,这里的ablum_id包含在了href中,因此我们只需要找到每一张相册的url,然后用正则匹配处来即可,其中这个页面的url简化为:

  • https://mm.taobao.com/self/al...{0}&page={1}

  • 所以我们可以通过上面得到的user_id构成请求即可,代码如下:

 ## 解析得到ablum_id,根据ablum_id解析请求出每一个相册的json数据def parse_ablum_id(self,response):if response.status==200:print response.urlitem = response.meta['item']soup = BeautifulSoup(response.text, 'lxml')divs = soup.find_all('div', class_='mm-photo-cell-middle')for div in divs:href = div.find('h4').find('a').get('href')items = self.pattern_ablum_id.findall(href)    #这里就得到了ablum_id
  • 上面已经获得了user_idablum_id,那么现在就可以请求每一个相册的json数据了,这个就不用多说了,详情请看源代码

MongoDB存储

安装方式

  • Windows下安装请看我的MogoDB干货篇

  • ubantu直接用sudo apt-get install安装即可

  • 安装对应python的包:pip install pymongo

  • 安装完成以后就可以连接了,下面贴出我的连接代码

from pymongo import MongoClientclass MongoDBPipelines(object):collection_name = 'taobao'def open_spider(self,spider):self.client = MongoClient('localhost', 27017)   #连接,这里的27017是默认的额端口号self.db = self.client['python']               #python是自己的数据库,当然这里不用提前建好也可以def close_spider(self, spider):            self.client.close()def process_item(self,item,spider):self.db[self.collection_name].update({'picId':item['picId']}, {'$set': dict(item)}, True)return item

现在这就算好了,当然这里还有很多东西需要优化的,像代理池。。。最后本人想在暑期找一个地方实习,但是一直没有好的地方,希望有实习的地方推荐的可以联系我,在这里先谢谢了

推荐

最后推荐博主的一些源码

  • scrapy爬取妹子网站实现图片的存储,这个只是一个演示怎样存储图片的实例,因此不想过多的投入时间去爬,因此写的不是很详细

  • scrapy爬取知乎用户的详细信息

更多文章请一步本人博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/541423.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

map在Java集合_java集合之Map

MapMap用于保存具有映射关系的数据。Map中key不允许重复,value可以重复,key和value之间存在单向一对一关系HashMap和Hashtable区别1 Hashtable线程安全、HashMap线程不安全,所以HashMap性能高一点2 Hashtable不允许用null做key和value&#x…

Java OutputStream close()方法与示例

OutputStream类close()方法 (OutputStream Class close() method) close() method is available in java.io package. close()方法在java.io包中可用。 close() method is used to close this OutputStream stream and free all system resources linked with this stream and …

怎样在fastboot 里面加入新的命令

fastboot 是android 默认的一种debug 方法。它的优点是在进入linux kernel 之前就可以操作。默认fastboot 支持的命令&#xff1a; usage: fastboot [ <option> ] <command>commands: update <filename> reflash device …

java编写字符串连接程序注释_Java 注解自动化处理对应关系实现注释代码化

public class EsQuery { private static int DEFAULT_SIZE 100; private final Map termFilter;private final Map rangeFilter;private final Map matchFilter;private int size;private String orderBy null;private String order null; // query 查询语法, 是否需要 filtere…

getlanguage_Java语言环境getLanguage()方法与示例

getlanguage区域设置类getLanguage()方法 (Locale Class getLanguage() method) getLanguage() method is available in java.util package. getLanguage()方法在java.util包中可用。 getLanguage() method is used to retrieve this Locale language code and the language co…

[转]Anaconda

安装 Anaconda Anaconda 可用于 Windows、Mac OS X 和 Linux。可以在 https://www.continuum.io/down... 上找到安装程序和安装说明。 如果计算机上已经安装了 Python&#xff0c;这不会有任何影响。实际上&#xff0c;脚本和程序使用的默认 Python 是 Anaconda 附带的 Python。…

win10 iot core java_Windows 10 IoT Core 正式版初体验

今天收到Windows 10 IoT Core Team邮件&#xff0c;Windows 10 IoT Core正式发布。以下记录了今天在Raspberry Pi 2上的体验过程&#xff1a;准备工作一台运行着正版Windows 10且版本不小于10240的个人PCVisual Studio 2015 版本不小于14.0.23107.0 D14Rel Install Visual Stud…

filterwriter_Java FilterWriter flush()方法与示例

filterwriterFilterWriter类flush()方法 (FilterWriter Class flush() method) flush() method is available in java.io package. flush()方法在java.io包中可用。 flush() method is used to flush out the string from this FilterWriter stream. flush()方法用于从此Filter…

VUE2 第五天学习--过渡效果

阅读目录 1.理解VUE---过渡效果回到顶部1.理解VUE---过渡效果 1. 过渡的-css-类名会有4个(css) 类名在 enter/leave 在过渡中切换。1. v-enter: 进入过渡的开始状态。在元素被插入时生效&#xff0c;在下一个帧移除。2. v-enter-active: 进入过渡的结束状态。在元素被插入时生效…

java 集合addall_Java集合的addAll()方法和示例

java 集合addall集合类的addAll()方法 (Collections Class addAll() method) addAll() Method is available in java.lang package. addAll()方法在java.lang包中可用。 addAll() Method is used to put all the given elements(ele) to the given collection (co). addAll()方…

国家可持续发展议程创新示范区创建工作推进会在北京召开

2019独角兽企业重金招聘Python工程师标准>>> 为推进地方申报国家可持续发展议程创新示范区相关工作&#xff0c;根据国家可持续发展议程创新示范区创建工作的进展及需求&#xff0c;2017年4月23日—25日&#xff0c;科技部社会发展科技司、中国21世纪议程管理中心在…

java控制台打印图片_java——控制台输入打印图形

1. 打印直角三角形需求说明&#xff1a;从控制台输入直角三角形的高度(行数)。每行*的数目依次为1、3、5、7等。实现思路&#xff1a;外层循环控制行数&#xff0c;根据用户输入的行数得到外层循环条件分析每行打印的内容&#xff1a;每一行均打印*号&#xff0c;第i行的*号数为…

Java日历compareTo()方法与示例

日历类的compareTo()方法 (Calendar Class compareTo() method) compareTo() method is available in java.util package. compareTo()方法在java.util包中可用。 compareTo() method is used to compare two Calendar objects or in other words, we can say this method is u…

在struts2中配置自定义拦截器放行多个方法

源码&#xff1a; 自定义的拦截器类&#xff1a; //自定义拦截器类:LoginInterceptor ; package com.java.action.interceptor; import javax.servlet.http.HttpSession; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionInvocation;im…

java多态和泛型_Java面向对象(二) 接口、多态和泛型

一、接口二、多态多态是同一个行为具有多个不同表现形式或形态的能力。2.1 类型转换转换方式隐式 向上转型对于基本数据类型&#xff0c;存储容量低的可自动向存储容量高的类型转换对于引用变量&#xff0c;子类可被转换为超类&#xff0c;可被赋给所属类实现的接口的引用显式 …

Java ArrayList contains()方法及示例

ArrayList类contains()方法 (ArrayList Class contains() method) contains() method is available in java.util package. contains()方法在java.util包中可用。 contains() method is used to check whether this Arraylist contains the given object or not. contains()方法…

BlockingQueue详解

前言&#xff1a; 在新增的Concurrent包中&#xff0c;BlockingQueue很好的解决了多线程中&#xff0c;如何高效安全“传输”数据的问题。通过这些高效并且线程安全的队列类&#xff0c;为我们快速搭建高质量的多线程程序带来极大的便利。本文详细介绍了BlockingQueue家庭中的所…

java isempty_Java ArrayDeque isEmpty()方法与示例

java isemptyArrayDeque类isEmpty()方法 (ArrayDeque Class isEmpty() method) isEmpty() Method is available in java.lang package. isEmpty()方法在java.lang包中可用。 isEmpty() Method is used to check whether this deque is "empty" or "non-empty&qu…

[QGLViewer]3D场景鼠标点击位置

重载鼠标事件&#xff1a; void AxMapControl::mousePressEvent(QMouseEvent* e) {switch(currentTool){case AX_DRAW_DIRECTION:{if (e->button() Qt::LeftButton) {QPoint screenPte->pos();qglviewer::Vec orig1, dir1;camera()->convertClickToLine(screenPt, or…

elispce导入java项目_emacs的java编程环境设置(jdee,lib,cedet,ecb

1&#xff1a;下载jdee,lib,ecb。(已安装cedet就不用再安了)2&#xff1a;解压缩放入load-path目录。然后load&#xff0c;require。(add-to-list load-path "~/.emacs.d/lisp/jdee-2.4.0.1/lisp")(add-to-list load-path "~/.emacs.d/lisp/elib-1.0")(add…