应对反爬虫机制

①、禁止cookie :有的网站会通过用户的cookie信息对用户进行识别和分析,此时可以通过禁用本地cookies信息让对方网站无法识别我们的会话信息

settings.py里开启禁用cookie

  1. # Disable cookies (enabled by default)
  2. COOKIES_ENABLED = False

②、设置下载延时:有的网站会对网页的访问频率进行分析,如果爬取过快,会被判断为自动爬取行为

settings.py里设置下载延时

  1. #DOWNLOAD_DELAY = 3  #去掉注释,3代表3秒

③、使用ip池: 有的网站会对用户的ip进行判断,所以需要多个ip地址。这些地址组成一个ip池,爬虫每次爬取会从ip池中随机选择一个ip,此时可以为爬虫项目建立一个中间件文件,定义ip使用规则

  1. #1、创建项目略过
  2.  
  3. #2、settings.py 设置代理ip地址池
  4.  
  5. IPPOOL=[
  6. {"ipaddr":"proxyip1"},
  7. {"ipaddr":"proxyip2"},
  8. {"ipaddr":"proxyip3"},
  9. {"ipaddr":"proxyip4"},
  10. {"ipaddr":"proxyip5"},
  11. {"ipaddr":"proxyip6"},
  12. {"ipaddr":"proxyip7"}
  13. ]
  14.  
  15. #3、创建一个中间件文件 middle_download_wares.py
  16.  
  17. #-*-coding:utf-8-*-
  18.  
  19. import random
  20. from mulitispd.settings import IPPOOL
  21. from scrapy.contrib.downloadermiddleware.httpproxy import HttpProxyMiddleware
  22.  
  23. class IPPOOLS(HttpProxyMiddleware):
  24. def __init__(self,ip=''):
  25. self.ip = ip
  26.  
  27. def process_request(self, request, spider):
  28. thisip = random.choice(IPPOOL)
  29. print ("current ip "+thisip["ipaddr"])
  30. request.meta['proxy'] = "http://"+thisip['ipaddr']
  31.  
  32. #4设置settings.py注册为项目中间件,格式:中间件所在目录.中间件文件名.中间件内部要使用的类
  33. DOWNLOADER_MIDDLEWARES = {
  34. #'mulitispd.middlewares.MulitispdDownloaderMiddleware': 543,
  35. 'scrapy.contrib.downloadermiddleware.httpproxy.HttpProxyMiddleware':123,
  36. 'mulitispd.middle_download_wares.IPPOOLS':125
  37. }

测试结果:

④、使用用户代理池: User-Agent变换使用,方法流程与使用ippool方法一样

  1. #1、设置settings.py 里User-agent
  2.  
  3. UAPOOL=[
  4. "MOzilla/5.0 ...",
  5. "Chrom/49.0.2623.22 ....."
  6. ]
  7.  
  8. #2、新建中间件文件
  9.  
  10. #-*-coding:utf-8-*-
  11.  
  12. import random
  13. from mulitispd.settings import UAPOOL
  14. from scrapy.contrib.downloadermiddleware.useragent import UserAgentMiddleware
  15.  
  16. class UAPOOLS(UserAgentMiddleware):
  17. def __init__(self,useragent=''):
  18. self.useragent = useragent
  19.  
  20. def process_request(self, request, spider):
  21. thisua = random.choice(UAPOOL)
  22. print ("current useragent "+thisua)
  23. request.headers.setdefault("User-Agent",thisua)
  24.  
  25. #3、settings.py注册中间件
  26. DOWNLOADER_MIDDLEWARES = {
  27. #'mulitispd.middlewares.MulitispdDownloaderMiddleware': 543,
  28. 'scrapy.contrib.downloadermiddleware.httpproxy.HttpProxyMiddleware':123,
  29. 'mulitispd.middle_download_wares.IPPOOLS':125,
  30. 'scrapy.contrib.downloadermiddleware.useragent.UserAgentMiddleware':2,
  31. 'mulitispd.middle_useragent_wares.UAPOOLS':1
  32. }

Scrapy核心架构

说明:

工作流

总结:

简单示例

爬取网页内容爬虫(爬取当当网特产)

创建项目及爬虫文件

  1. scrapy startproject autopro
    scrapy genspider -t basic autospd dangdang.com

编写items.py

  1. import scrapy
  2.  
  3. class AutoproItem(scrapy.Item):
  4. name = scrapy.Field()      #商品名称
  5. price = scrapy.Field()      #商品价格
  6. link = scrapy.Field()      #商品链接
  7. comnum = scrapy.Field()     #商品评论数量

编写爬虫文件autospd.py

  1. # -*- coding: utf-8 -*-
  2. import scrapy
  3. from autopro.items import AutoproItem
  4. from scrapy.http import Request
  5.  
  6. class AutospdSpider(scrapy.Spider):
  7. name = 'autospd'
  8. allowed_domains = ['dangdang.com']
  9. start_urls = ['http://dangdang.com/']
  10.  
  11. def parse(self, response):
  12. item = AutoproItem()
  13. item['name'] = response.xpath("//a[@class='pic']/@title").extract()      #xpath分析结果,@title表示获取titile属性的值  
  14. item['price'] =response.xpath("//span[@class='price_n']/text()").extract()
  15. item['link'] = response.xpath("//a[@class='pic']/@href").extract()
  16. item['comnum'] = response.xpath("//a[@dd_name='单品评论']/text()").extract()
  17. yield item
  18. for i in range(1,10):
  19. url="http://category.dangdang.com/pg"+str(i)+"-cid4011029.html"
  20.  
  21. yield Request(url,callback=self.parse)

编写pipelines.py

  1. import codecs        #导入codecs模块直接进行解码
  2. import json
  3.  
  4. class AutoproPipeline(object):
  5.  
  6. def __init__(self):
  7. self.file = codecs.open("/root/mydata.json",'wb',encoding="utf-8")    #表示将爬取结果写到json文件里
  8.  
  9. def process_item(self, item, spider):        #process_item为pipelines中的主要处理方法,默认会自动调用
  10. for i in range(0,len(item["name"])):
  11. name = item['name'][i]
  12. price = item['price'][i]
  13. comnum = item['comnum'][i]
  14. link = item['link'][i]
  15. goods = {"name":name,"price":price,"comnum":comnum,"link":link}
  16. i = json.dumps(dict(goods),ensure_ascii=False)
  17. line = i+'\n'
  18. self.file.write(line)
  19. return item
  20.  
  21. def close_spider(self,spider):
  22. self.file.close()

设置settings.py

  1. ROBOTSTXT_OBEY = False #表示不遵循robots协议
  2. COOKIES_ENABLED = False #禁止cookie

  3. #开启pipelines
  4. ITEM_PIPELINES = {
  5. 'autopro.pipelines.AutoproPipeline': 300,
  6. }

结果:

CrawlSpider

crawlspider是scrapy框架自带爬取网页的爬虫,可以实现网页的自动爬取

创建crawlspider 爬虫文件

  1. crapy genspider -t crawl test_crawl jd.com

test_crawl.py

  1. # -*- coding: utf-8 -*-
  2. import scrapy
  3. from scrapy.linkextractors import LinkExtractor
  4. from scrapy.spiders import CrawlSpider, Rule
  5.  
  6. class TestCrawlSpider(CrawlSpider):
  7. name = 'test_crawl'
  8. allowed_domains = ['jd.com']
  9. start_urls = ['http://jd.com/']
  10.  
  11. #链接提取器 ,allow 为自定义设置的爬行规则,follow表示跟进爬取。即发现新的链接继续爬行,allow_domains表示允许爬行的连接
  12. rules = (
  13. Rule(LinkExtractor(allow=r'Items/'),allow_domains=(aa.com) callback='parse_item', follow=True),
  14. )
  15.  
  16. def parse_item(self, response):
  17. i = {}
  18. #i['domain_id'] = response.xpath('//input[@id="sid"]/@value').extract()
  19. #i['name'] = response.xpath('//div[@id="name"]').extract()
  20. #i['description'] = response.xpath('//div[@id="description"]').extract()
  21. return i

scrapy基础二的更多相关文章

  1. Python全栈开发【基础二】

    Python全栈开发[基础二] 本节内容: Python 运算符(算术运算.比较运算.赋值运算.逻辑运算.成员运算) 基本数据类型(数字.布尔值.字符串.列表.元组.字典) 其他(编码,range,f ...

  2. Bootstrap <基础二十九>面板(Panels)

    Bootstrap 面板(Panels).面板组件用于把 DOM 组件插入到一个盒子中.创建一个基本的面板,只需要向 <div> 元素添加 class .panel 和 class .pa ...

  3. Bootstrap <基础二十八>列表组

    列表组.列表组件用于以列表形式呈现复杂的和自定义的内容.创建一个基本的列表组的步骤如下: 向元素 <ul> 添加 class .list-group. 向 <li> 添加 cl ...

  4. Bootstrap<基础二十七> 多媒体对象(Media Object)

    Bootstrap 中的多媒体对象(Media Object).这些抽象的对象样式用于创建各种类型的组件(比如:博客评论),我们可以在组件中使用图文混排,图像可以左对齐或者右对齐.媒体对象可以用更少的 ...

  5. Bootstrap <基础二十六>进度条

    Bootstrap 进度条.在本教程中,你将看到如何使用 Bootstrap 创建加载.重定向或动作状态的进度条. Bootstrap 进度条使用 CSS3 过渡和动画来获得该效果.Internet ...

  6. Bootstrap <基础二十五>警告(Alerts)

    警告(Alerts)以及 Bootstrap 所提供的用于警告的 class.警告(Alerts)向用户提供了一种定义消息样式的方式.它们为典型的用户操作提供了上下文信息反馈. 您可以为警告框添加一个 ...

  7. Bootstrap<基础二十四> 缩略图

    Bootstrap 缩略图.大多数站点都需要在网格中布局图像.视频.文本等.Bootstrap 通过缩略图为此提供了一种简便的方式.使用 Bootstrap 创建缩略图的步骤如下: 在图像周围添加带有 ...

  8. Bootstrap <基础二十三>页面标题(Page Header)

    页面标题(Page Header)是个不错的功能,它会在网页标题四周添加适当的间距.当一个网页中有多个标题且每个标题之间需要添加一定的间距时,页面标题这个功能就显得特别有用.如需使用页面标题(Page ...

  9. Bootstrap <基础二十二>超大屏幕(Jumbotron)

    Bootstrap 支持的另一个特性,超大屏幕(Jumbotron).顾名思义该组件可以增加标题的大小,并为登陆页面内容添加更多的外边距(margin).使用超大屏幕(Jumbotron)的步骤如下: ...

随机推荐

  1. linux查找符合条件的文件并删除

    找到根目录下所有的以test开头的文件并把查找结果当做参数传给rm -rf命令进行删除: 1.find / -name “test*” |xargs rm -rf 2.find / -name “te ...

  2. Python小爬虫——抓取豆瓣电影Top250数据

    python抓取豆瓣电影Top250数据 1.豆瓣地址:https://movie.douban.com/top250?start=25&filter= 2.主要流程是抓取该网址下的Top25 ...

  3. ARC 086 E - Smuggling Marbles(dp + 启发式合并)

    题意 Sunke 有一棵 \(N + 1\) 个点的树,其中 \(0\) 为根,每个点上有 \(0\) 或 \(1\) 个石子, Sunke 会不停的进行如下操作直至整棵树没有石子 : 把 \(0\) ...

  4. 使用 Zabbix 监控 Jenkins

    笔者最近的工作涉及到使用 Zabbix 监控 Jenkins.在谷歌上搜索到的文章非常少,能操作的就更少了.所以决定写一篇文章介绍如何使用 Zabbix 监控 Jenkins. 下图为整体架构图: 整 ...

  5. Hdoj 1087.Super Jumping! Jumping! Jumping!

    Problem Description Nowadays, a kind of chess game called "Super Jumping! Jumping! Jumping!&quo ...

  6. 纯CSS画的基本图形(圆形、三角形、多边形、爱心、八卦等)

    1.圆形 .circle { width: 100px; height: 100px; background: red; border-radius: 50px; } 2.椭圆 .oval { wid ...

  7. [WC2005]双面棋盘(并查集+分治)

    题目描述 题解 唉,还是码力不行,写了一个多小时发现想错了又重构了一个多小时. 这道题意图很显然,动态维护联通块,有一个经典做法就是用LCT维护按照删除时间维护的最大生成树. 网上还有一种神奇的做法, ...

  8. socket,tcp,http三者之间的区别和原理

    http.TCP/IP协议与socket之间的区别下面的图表试图显示不同的TCP/IP和其他的协议在最初OSI模型中的位置: 7 应用层 例如HTTP.SMTP.SNMP.FTP.Telnet.SIP ...

  9. Ecplise 快捷键笔记

    1.显示出这个方法被哪些方法调用(Ctrl+Alt+H) 选中方法名,点右键,选“open call hierarchy”,其快捷键“Ctrl+Alt+H”,Eclipse就会显示出这个方法被哪些方法 ...

  10. Electron入门笔记(一)-自己快速搭建一个app demo

    Electron学习-快速搭建app demo 作者: 狐狸家的鱼 Github: 八至 一.安装Node 1.从node官网下载 ,最好安装.msi后缀名的文件,新手可以查看安装教程进行安装. 2. ...