目标
Scrapy简介
Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。
使用过程创建一个Scrapy项目定义提取的Item编写爬取网站的 spider 并提取 Item编写Item Pipeline 来存储提取到的Item(即数据)
接下来的图表展现了Scrapy的架构,包括组件及在系统中发生的数据流的概览(绿色箭头所示)。下面对每个组件都做了简单介绍,并给出了详细内容的链接。数据流如下所描述
Paste_Image.png
组件
Scrapy Engine引擎负责控制数据流在系统中所有组件中流动,并在相应动作发生时触发事件。详细内容查看下面的数据流(Data Flow)部分。调度器(Scheduler)调度器从引擎接受request并将他们入队,以便之后引擎请求他们时提供给引擎。下载器(Downloader)下载器负责获取页面数据并提供给引擎,而后提供给spider。SpidersSpider是Scrapy用户编写用于分析response并提取item(即获取到的item)或额外跟进的URL的类。每个spider负责处理一个特定(或一些)网站。更多内容请看 Spiders 。Item PipelineItem Pipeline负责处理被spider提取出来的item。典型的处理有清理、验证及持久化(例如存取到数据库中)。更多内容查看 Item Pipeline 。下载器中间件(Downloader middlewares)下载器中间件是在引擎及下载器之间的特定钩子(specific hook),处理Downloader传递给引擎的response。其提供了一个简便的机制,通过插入自定义代码来扩展Scrapy功能。更多内容请看下载器中间件(Downloader Middleware)。Spider中间件(Spider middlewares)Spider中间件是在引擎及Spider之间的特定钩子(specific hook),处理spider的输入(response)和输出(items及requests)。其提供了一个简便的机制,通过插入自定义代码来扩展Scrapy功能。更多内容请看 Spider中间件(Middleware)。
三:实例分析
1.从网站的主页进入最新斗图表情后网址是http://www.doutula.com/photo/list/,点击第二页后看到网址变成了http://www.doutula.com/photo/list/?page=2,那我们就知道了网址的构成最后的page就是不同的页数。那么spider中的start_urls开始入口就如下定义,爬取1到20页的图片表情。想下载更多表情页数你可以再增加。start_urls =['http://www.doutula.com/photo/list/?page={}'.format(i) for i in range(1,20)]
2.进入开发者模式分析网页结构,可以看到如下结构。右击复制一下xpath地址即可得到全部的表情所在的a标签内容。a[1]表示第一个a,去掉[1]就是全部的a。//*[@id="pic-detail"]/div/div[1]/div[2]/a
值得注意的是这里的表情有两种:一个jpg,一个gif动图。如果获取图片地址时只抓取a标签下面第一个img的src就会出错,所以我们要抓取img中的含有data-original的值。这里a标签下面还一个p标签是图片简介,我们也抓取下来作为图片文件的名称。图片的连接是'http:'+ content.xpath('//img/@data-original')
四:实战代码
完整代码地址 github.com/rieuse/learnPython
1.首先使用命令行工具输入代码创建一个新的Scrapy项目,之后创建一个爬虫。scrapy startproject ScrapyDoutucd ScrapyDoutu\\ScrapyDoutu\\spidersscrapy genspider doutula doutula.com
2.打开Doutu文件夹中的items.py,改为以下代码,定义我们爬取的项目。import scrapyclass DoutuItem(scrapy.Item):
3.打开spiders文件夹中的doutula.py,改为以下代码,这个是爬虫主程序。#-*- coding: utf-8-*-import os
3.这里面有很多值得注意的部分:
因为图片的地址是放在sinaimg.cn中,所以要加入allowed_domains的列表中content.xpath('//img/@data-original').extract()[i]中extract()用来返回一个list(就是系统自带的那个)里面是一些你提取的内容,[i]是结合前面的i的循环每次获取下一个标签内容,如果不这样设置,就会把全部的标签内容放入一个字典的值中。filename ='doutu\\{}'.format(item['name'])+ item['img_url'][-4:]是用来获取图片的名称,最后item['img_url'][-4:]是获取图片地址的最后四位这样就可以保证不同的文件格式使用各自的后缀。最后一点就是如果xpath没有正确匹配,则会出现(referer: None)
4.配置settings.py,如果想抓取快一点CONCURRENT_REQUESTS设置大一些,DOWNLOAD_DELAY设置小一些,或者为0.#-*- coding: utf-8-*-BOT_NAME ='ScrapyDoutu'SPIDER_MODULES =['ScrapyDoutu.spiders']NEWSPIDER_MODULE ='ScrapyDoutu.spiders'DOWNLOADER_MIDDLEWARES ={
5.配置middleware.py配合settings中的UA设置可以在下载中随机选择UA有一定的反ban效果,在原有代码基础上加入下面代码。这里的user_agent_list可以加入更多。import randomfrom scrapy.downloadermiddlewares.useragent import UserAgentMiddlewareclass RotateUserAgentMiddleware(UserAgentMiddleware):
6.到现在为止,代码都已经完成了。那么开始执行吧!
scrapy crawl doutu
之后可以看到一边下载,一边修改User Agent。
五:总结
学习使用Scrapy遇到很多坑,但是强大的搜索系统不会让我感觉孤单。所以感觉Scrapy还是很强大的也很意思,后面继续学习Scrapy的其他方面内容。
github地址加群
学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入学习交流群
,我们一起学Python!
点击头像查看历史
边爬边学,边学边爬(新手慢慢来,可以私聊我)
1.首先获取目标页面
2.这里以豆瓣为例,来获取页面中的所有书籍的名称
(仅供学习交流)
http://www.douban.com/tag/小说/?focus=book
获取首页代码
分享
获取结果,通过分析页面源代码(建议用firefox浏览器,按F12,可看到源代码)
然后解析(用BeautifulSoup)
a).缩小范围,我们通过id="book"获取所有的书。b).然后通过class="title"~遍历所有的书名。
对代码说明a).book_div通过id=book获取div标签b).book_a通过class="title"获取所有的booka标签c).for循环遍历book_a所有的a标签d).book.string输出a标签中的内容
结果
3.存储获取的数据
写入数据库,这里就以Mysql为例(下载安装MySQLdb模块这里不做叙述),就写怎么去执行一条sql语句
a).上面是执行sql语句的基本流程,当然针对不同的sql语句,会进行不同的处理。b).我们在创建数据库的时候一定要注意编码问题,个人建议使用utf8
4.爬虫完成,之后介绍IP和爬虫策略
学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入学习交流群
,我们一起学Python!
每天晚上都有大神与你高清视频免费分享交流行业最新动态凑热闹就不要加了群名额有限!
前两篇爬虫12(点击头像看历史)
资料仅供学习
方式一
直接爬取网站
http://chanyouji.com/(网站会拦截IP,第二篇就用到了)
1~打开网页,里面有很多人分享的游记,我们就进行游记爬取2~点开其中一篇游记,看到链接地址形式http://chanyouji.com/trips/,这个时候,思考,这个数字代表的含义?会不会是游记在数据库的ID,如果是的话那我们换个数字会不会得到别的游记,试一下访问http://chanyouji.com/trips/,确实看到了不一样的游记。自己试试
c).结论,我们可以来请求到不同的数据。然而,这并不一定是可以按照上两节的方式来爬取。原因有很多。比如,有些数据是通过js渲染的。对于有web开发基础的很好理解,但是对于没有做过web开发的同学解释一下。我们假设要买一个房子,房子种类很多,分成两类,一类是没有装修的,另一类是装修好的。对于前者,我们要买家具装修布置,对于装修好的我们可以直接入住生活。带入例子http://chanyouji.com/trips/*****这个请求就买一个房子,没装修就是说返回的是这个网站的外壳,需要另外在JS里面重新请求数据,放到外壳里面。装修好的数据什么的直接给你。d).判断两类的结果:很简单。以火狐浏览器为例,F12打开调试窗口,找到网络->点击请求得到:
数据显示在里面后点开响应,会看到请求来的源代码(用爬虫发请求的结果)如下
e).假如是js渲染的,我没在这个网站上找到用js渲染的换个目标来解释。
方式二
目标网址:http://music.163.com/#/user/home?id=48353(一个网页)方法同上
a).这个http://music.163.com/user/home?id=48353缺少了歌单
b).我们寻找那个歌单的数据
发现http://music.163.com/weapi/user/playlist?csrf_token=这个就是返回的歌单,我们只需要请求这个接口的时候,带上该有的参数,就能得到这个数据。
方式三
(新)进行利用目标网址的APP,仍以蝉游记进行
APP的接口返回值一般都是JSON(比较好解析除了网易云音乐)核心:拦截APP请求。
a).我在电脑上安装安卓模拟器(用的是bluestacks不太好安装的)b).在里面安装APP蝉游记(还可以用电脑开个热点,用手机连接这个热点也能拦截)c).安装httpanalyzer其他的也行,打开httpanalyzerd).使用目标APP拦截到请求如下
e).请求时注意http和http的区别。遇到http的请求,试下用http替换。(有的比较麻烦不行)
f).把数据转化成标准的json数据,用这个工具http://www.bejson.com/jsonviewernew/
把数据复制过去格式化一下
游记代码
结果
学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入学习交流群
,我们一起学Python!
每天晚上都有大神与你高清视频免费分享交流行业最新动态凑热闹就不要加了群名额有限!