在使用命令行创建scrapy项目后,会发现在spider.py文件内会生成这样的代码:

name = 'quotes'
allowed_domains = ['quotes.toscrape.com']
start_urls = ['http://quotes.toscrape.com/']

其中比较好理解的是name,这个字段代表爬虫项目名称,在命令行创建时已经指定,allowed_domains代表允许爬取的域名,这两个字段均在创建时已经设置好,不需要更改,但比较特殊的是start_url这个字段,它也是一个列表形式,官方文件的解释为包含spider在启动时爬取的url列表,用于定义初始请求。这样就可以类比如果不使用scrapy框架,url应该如何定义;
例如爬取豆瓣读书时发现首页url为"https://book.douban.com/top250?start=0",
以后每翻页一次start字段值递增25,这样就可以很容易用一个循环做到url的构建,再比如如果爬取今日头条图片,分析Ajax后首页url为“https://www.toutiao.com/search_content/?offset=0&format=json&keyword=街拍&autoload=true&count=20&cur_tab=1&from=search_tab&pd=synthesis”,以后每页更改其中offset参数递增20,则可以利用urlencode()方法构建url。
其实scrapy的start_url构建方法与普通爬虫的构建本质上没有任何区别,只是因为在框架的调度使其实现更加容易。
下面以http://images.so.com网站为例:
创建好项目文件后,spider.py内的代码如下:

class ImagesSpider(Spider):name = 'images'allowed_domains = ['images.so.com']start_urls = ['http://images.so.com/']def prase(self):pass

如果我们不做任何其他处理,则爬虫启动只会爬取"http://images.so.com/"上的内容。
因为这是一个列表形式,笨一点的方法就是把所有要爬取的url添加到列表中,然后遍历就可以了:

start_urls = ['http://images.so.com/z?ch=beauty','http://images.so.com/z?ch=wallpaper']for url in start_urls:yield scrapy.Request(url=url, callback=self.parse)

这样当然没错,而且还很好理解,但未免显得太实在了。既然要返回一组列表,自然而然就可以用到以前的构建方法,构建代码如下:

    def start_requests(self):data={'ch':'photography','listtype':'new'}base_url='https://image.so.com/zj?'for page in range(1,self.settings.get('MAX_PAGE')+1):data['sn']=page*30params=urlencode(data)url=base_url+paramsyield Request(url=url,callback=self.parse)

这里的url是分析Ajax得到的,可以看出构建方法没有什么特别之处,这个方法返回的Request请求,而回调函数就是我们解析html的方法,爬虫运行时,不断的将请求生成并被parse()方法调用解析,parse()方法代码如下:

    def parse(self, response):result=json.load(response.text)for image in result.get('list'):item=Images360Item()item['id']=image.get('imageid')item['url']=image.get('qhimg_url')item['title']=image.get('group_title')item['thumb']=image.get('qhimg_thumb_url')yield item

当涉及到不止一层关系的爬虫,例如微博的爬取,爬取了微博首页后,还要爬取它的关注,粉丝,微博列表的情况下,就相对复杂的多了。但其实本质是一样的,只是下一层的start_url的构建不是在start_request()方法中,而是在第一层罗辑的解析方法中生成,伪代码如下,以微博为例:

class WeibocSpider(Spider):name = 'weiboc'allowed_domains = ['m.weibo.cn']user_url=''follow_url=''fan_url=''weibo_url=''start_user=['3217179555']def start_requests(self):for uid in self.start_user:yield Request(self.user_url.format(id=uid),callback=self.parse_user)def parse_user(self,response):self.logger.debug(response)result=json.loads(response.text)if result.get('data').get('userInfo'):user_Info=result.get('data').get('userInfo')user_item=UserItem()field_map={}for field ,attr in field_map.items():user_item[field]=user_Info.get['attr']#返回用户信息#关注uid=user_Info.get('id')#构造下一页链接,并返回Requestyield Request(self.follow_url.format(uid=uid,page=1),callback=self.parse_follows,meta={'page':1,'uid':uid})#fansyield Request(self.fan_url.format(uid=uid,page=1),callback=self.parse_fans,meta={'page':1,'uid':uid})#weiboyeild Request(self.weibo_url.format(uid=uid,page=1),callback=self.parse_weibos,meta={'page':1,'uid':uid})def parse_follows(self,response):"""解析用户关注:param response: Response对象:return:"""result=json.loads(response.text)if result.get('ok') and result.get('data').get('cards') and len(result.get('data').get('cards'))and result.get('data').get('cards')[-1].get('card_group'):#解析关注列表每个用户信息并发起新的解析请求follows=result.get('data').get('cards')[-1].get('card_group')for folow in follows:if follow.get('user'):uid=follow.get('user').get('id')yield Request(self.user_url.format(uid=uid)callback=self.parse_user())#关注列表uid=response.meta.get('uid')user_relation_item=UserRelationItem()follows=[{'id':follow.get('user').get('id'),'name':follow.get('user').get('screen_name')}for follow in follows]user_relation_item['id']=uiduser_relation_item['follows']=followsuser_relation_item['fans']=[]yield  user_relation_item#提取下一页的关注page=response.meta.get('page')+1yield  Request(self.follow_url.format(uid=uid,page=page),callback=self.parse_follows,meta={'page':page.'uid':uid})

这里首先通过start_request()方法生成要爬取的微博首页请求,在parse_users()方法解析得到用户信息后,再生成下一层罗辑需要的请求列表,这样就可以实现一层层不断的爬取,貌似用到了深度优先的概念。
ps:GitHub地址:https://github.com/linl12138/image

python爬虫学习笔记-scrapy框架之start_url相关推荐

  1. python爬虫学习笔记-scrapy框架(1)

    简介 什么是框架? 所谓的框,其实说白了就是一个[项目的半成品],该项目的半成品需要被集成了各种功能且具有较强的通用性. Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架,非常出名, ...

  2. 爬虫学习笔记-scrapy框架介绍

    优势 批量爬取数据 高效率 架构图 各模块的功能 1,Scrapy Engine(引擎):Scrapy框架的核心部分.负责在Spider和ItemPipeline.Downloader.Schedul ...

  3. Python爬虫5.3 — scrapy框架spider[Request和Response]模块的使用

    Python爬虫5.3 - scrapy框架spider[Request和Response]模块的使用 综述 Request对象 scrapy.Request()函数讲解: Response对象 发送 ...

  4. python爬虫学习笔记3.2-urllib和request练习

    python爬虫学习笔记3.2-urllib和request练习 一.urllib练习 1.百度贴吧案例 需求 分析 手动测试查询流程 观察页面 分析特殊部分 https://tieba.baidu. ...

  5. python爬虫学习笔记 3.9 (了解参考:训练Tesseract)

    python爬虫学习笔记 3.9 (了解参考:训练Tesseract) 参考阅读:训练Tesseract 要使用 Tesseract 的功能,比如后面的示例中训练程序识别字母,要先在系统中设置一 个新 ...

  6. Python爬虫学习笔记 -- 爬取糗事百科

    Python爬虫学习笔记 -- 爬取糗事百科 代码存放地址: https://github.com/xyls2011/python/tree/master/qiushibaike 爬取网址:https ...

  7. python爬虫学习笔记 1.9 (Handler处理器 和 自定义Opener)

    python爬虫学习笔记 1.1(通用爬虫和聚焦爬虫) python爬虫学习笔记 1.2 ( HTTP和HTTPS ) python爬虫学习笔记 1.3 str和bytes的区别 python爬虫学习 ...

  8. python爬虫学习笔记2模拟登录与数据库

    前言 为了加入学校里面一个技术小组,我接受了写一个爬取学校网站通知公告的任务.这个任务比以前写的爬虫更难的地方在于,需要模拟登录才能获得页面,以及将得到的数据存入数据库. 本文按照日期来记录我完成任务 ...

  9. python 爬虫 学习笔记(一)Scrapy框架入门

    沉迷于通过高效算法及经典数据结构来优化程序的时候并不理解,为什么多线程可以优化爬虫运行速度?原来是程序特性所决定的:传统算法的程序复杂度主要来源于计算,但网络程序的计算时间可以忽略不计,网络程序所面临 ...

最新文章

  1. 设计模式之建造者模式(01)
  2. 文巾解题 LCP 11. 期望个数统计
  3. leetcode第72题:编辑距离
  4. ios UITableView顶部向下偏移
  5. Unity3D 之UGUI 滑动条(Slider)
  6. 安装tron_具有Tron效果的JavaFX 2 Form
  7. 【转】带你玩转Visual Studio——03.带你了解VC++各种类型的工程
  8. scrapy爬虫架构介绍和初试
  9. Processor Tracing | 处理器追踪
  10. Matter-JS Render.create 渲染器创建
  11. CPU负载均衡之cpufreq使用
  12. ibm服务器机 安装系统安装系统安装方法,IBM服务器系统安装图解全攻略
  13. 二叉树遍历(前中后序遍历代码及注释)
  14. 【转】最落魄的日子你是怎样熬过来的?
  15. 关于FRM这些事,你必须完全知道!
  16. 操作系统——进程管理思维导图(一)
  17. 解决pip下载速度过慢及超时等其它的报错的方法适于多种操作系统(详细)
  18. Office快捷键之王,这个键应该没人不服
  19. 如何拍出来好看的Vlog,必备小技能(六)?
  20. automotive 安卓开发_谷歌首次提及「Android Automotive」,是安卓车机系统亮相前奏?...

热门文章

  1. 66页3万字医疗行业大数据治理解决方案
  2. Linux下各压缩方式测试(压缩率和使用时间)
  3. android usb单反相机,android mtp 获取单反相机中的照片
  4. C++中的泛型编程有函数模板与类模板
  5. 如何在评估机器学习模型时防止数据泄漏
  6. 这样解读PID算法,有点意思~
  7. autorelease 释放池
  8. npcap loopback adapter是什么意思_阜阳为什么叫阜阳,阜阳古时候叫什么,阜阳历史的由来...
  9. 如何测试概率性事件-二项分布置信区间
  10. 【论文阅读】Geography-Aware Sequential Location Recommendation