本文中的知识点:

  • 安装scrapy
  • scrapy的基础教程
  • scrapy使用代理

安装scrapy

由于小哥的系统是win7,所以以下的演示是基于windows系统。linux系统的话,其实命令都一样的,没啥差,windows与linux都可以用。

pip install scrapy

安装好后,先看下scrapy是否安装上了,确认下,我的是Scrapy 1.8.0

scrapy version

好了,安装很简单。用scrapy创建个新项目吧。命令行下输入,这里注意,命令会在当前目录下创建ts项目。


创建新项目

# 新建一个名为ts的scrapy的项目
scrapy startproject ts

我是在桌面下创建的ts目录,创建成功后给的提示截图如下。

分析目录文件

让我们去目录下看看都有些什么,有个scrapy.cfg配置文件,ts目录。



在进入ts目录,看下有些什么。嗯~~~ 主菜来了,这里就是我们要写的内容了。

  • spiders目录——爬虫代码放这里
  • items.py ——要抓取的字段
  • middleware——中间件
  • pipelines——管道文件
  • settings——设置文件

先不用管这么细,我们先跑起来。


代码样例

抓个百度首页试试吧。

进入spiders目录里,创建个baidu的爬虫,并且限制抓取域名的范围。注意要在spiders的目录下输入以下命令

scrapy genspider baidu "baidu.com"



看到命令已经帮我们自动创建了爬虫代码,打开文件看下。

看下这里的代码,先导入scrapy,定义了一个BaiduSpider类,必须要继承scrapy.Spider。这里注意,里面有3个必须的属性(name,allowed_domains,start_urls)。

  • name——爬虫的名字,运行爬虫的时候就看这个参数。
  • allowed_domains——抓取的域名限制,这是我们刚才在命令行输入的。PS:抓百度,当然限制在百度内了,别抓到淘宝上去了,先不跨界
  • start_urls——要抓取的url列表,类型list
  • parse函数——抓取后的动作,可以自己定义

好的,既然都OK了,那我们去运行下,看看会发生什么。

命令行下输入,注意这里的baidu就是爬虫的name属性。

scrapy crawl baidu

嘎嘎嘎,,,一大堆信息,看的是不是有点懵,说实话,我也是。这是正常信息,已经跑起来了。这些参数,大家随意看一看吧,我先不解释了。。。手动滑稽~~~哈哈哈,其实先不用看,一会我们在讲。

代码改造下,按照我们的预期来

还记得刚才的parse函数么,不过命令创建的是啥事都没干。自己定义下,让它做点事,也好知道代码是按照我们的预期去跑的。

# -*- coding: utf-8 -*-
import scrapy class BaiduSpider(scrapy.Spider):
name = 'baidu'
allowed_domains = ['baidu.com']
start_urls = ['http://baidu.com/'] def parse(self, response):
# 打印下response返回的状态码
print(response.status)

在来运行下,还记得刚才的运行命令吗?不记得了?。。。行,我在说一遍,

scrapy crawl baidu

好的,让我们看看会给什么信息。嗯,,,有点问题,没有打印response的状态码,看下日志,这里说的是爬虫碰到了robots.txt,给Forbidden(禁止)了。MD,百度竟然不给我爬,百度自己的spider都在爬其他网站的,,,

这里得解释下为什么禁止了,这其实就是个爬虫的哲学问题了,盗亦有道的道理,相信大家都听说过,爬虫也是,爬亦有道。robots.txt也就是robots协议,这个文件会告诉爬虫,哪些能爬,哪些不能爬,爬虫要遵守这个规则。毕竟是别人的网站嘛,,,

本文以教学为主,旨在教大家使用scrapy框架,合理使用爬虫,遵守互联网规则是每一位互联网人的责任。



好的,问题该怎么解决?其实robots.txt也是可以解决的。这个时候settings.py就派上用场了。到我们之前的目录下,找到settings.py文件。



打开看下,注意到ROBOTSTXT_OBEY = True ,这个就是遵守robots协议。

改成False,不遵守robots协议 ~~~嘿嘿嘿,别笑,,,我只是教大家学scrapy框架而已



再来运行下。看到这里就已经打印出来了,返回200,成功抓取百度。

再来改造下

改造下parse函数,把抓取的数据保存到一个文件里。毕竟之前的定义的parse动作是打印各种信息,都在看日志,脑袋都大了,这次直接点,看文件好吧。

# -*- coding: utf-8 -*-
import scrapy class BaiduSpider(scrapy.Spider):
name = 'baidu'
allowed_domains = ['baidu.com']
start_urls = ['http://baidu.com/'] def parse(self, response):
# 定义文件名 baidu.html
filename = 'baidu.html'
with open(filename, 'wb') as f:
f.write(response.body) #文件写入response的body信息

好的,运行下试试。(PS:命令没忘吧,忘了的往上翻翻),这里注意我是在spiders目录下运行的,baidu.html文件也会保存在当前目录下。





看到了吧,文件出来了,直接双击打开看看,嗯,是百度首页。

使用代理

准备工作,找个可靠的代理IP,剩下的跟着我的步骤走。

修改中间件配置

这里就需要用到中间件了,找到文件middleware.py,打开看看文件。



这就是项目的中间件配置了。参数挺多,不过设置代理,我们只需要关注几个参数即可。



找到TsDownloaderMiddleware,这个类就是我们的项目下载器的中间件,我们的代理配置主要写在process_request函数里。



改成

    def process_request(self, request, spider):
# Called for each request that goes through the downloader
# middleware. # Must either:
# - return None: continue processing this request
# - or return a Response object
# - or return a Request object
# - or raise IgnoreRequest: process_exception() methods of
# installed downloader middleware will be called
# 代理IP由快代理赞助
proxy = '112.192.158.65:20823'
# 做了个处理,http与https
if request.url.startswith("http://"):
request.meta['proxy'] = "http://%s" % proxy
elif request.url.startswith("https://"):
request.meta['proxy'] = "https://%s" % proxy
return None

修改后如图

settings.py文件也需要修改,需要修改两处:

1、header参数,记住爬虫要模拟用户的真实请求。找到USER_AGENT参数,改成自己浏览器的ua,不知道怎么找ua的同学可以看我前面的一篇教程(点击跳转)中有提到。



修改后



2、找到DOWNLOADER_MIDDLEWARES参数,Ctrl + f搜索,注释掉这个配置保存,启动配置



注释后,修改后



好的,在改下我们的爬虫代码,spiders目录下的baidu.py文件。因为我们用了代理,所以去访问下查IP的网站,看看是否用上代理了。

# -*- coding: utf-8 -*-
import scrapy class BaiduSpider(scrapy.Spider):
name = 'baidu'
allowed_domains = ['baidu.com']
start_urls = ['https://www.baidu.com/s?ie=UTF-8&wd=ip'] def parse(self, response):
filename = 'baidu.html'
with open(filename, 'wb') as f:
f.write(response.body)



好的,现在在spiders目录下运行下,看看有没有文件出来。



有了,打开文件看下。对吧,这里查到的IP也是我们在代码样例中的IP。说明成功用上代理了。



scrapy使用代理总结下,需要修改及注意那些点。

  • 修改中间件文件middleware.py,主要修改downloader中间件的process_request函数。
  • 修改配置文件settings.py,设置自己的ua;启用DOWNLOADER_MIDDLEWARES配置;

嗯,主要注意这两个点。

其实还有一种设置代理的方法,我就先不写了,交给大家去研究吧。

进阶学习:

最新文章

  1. 在注册表中无Python3.5安装路径的情况下安装pywin32-
  2. android沉浸式状态栏设置(4.4以上版本)
  3. GZFramwork快速开发框架演练之会员系统(四)添加商品管理
  4. nginx/Windows-1.9.3启动脚本
  5. 【maven 报错】maven项目update之后报错One or more constraints have not been satisfied.
  6. js停止冒泡和阻止浏览器默认行为
  7. 闲谈Future模式-订蛋糕
  8. JIRA 6.0.1 (ZIP Archive)最新破解方法,绝对可用
  9. 用javascript向一个网页连接接口发送请求,并接收该接口返回的json串
  10. 【转】MVP和MVC的区别
  11. Javascript兼容收集
  12. pwd 的“P”选项
  13. SQL SERVER服务器登录名、角色、数据库用户、角色、架构的关系
  14. springboot下整合各种配置文件
  15. MySQL查询优化:LIMIT 1避免全表扫描
  16. 初入码田--ASP.NET MVC4 Web应用开发之二 实现简单的增删改查
  17. hibernate的枚举注解@Enumerated
  18. unzipping/Users/xq/.gradle/wrapper /dists/gradle-3.3-all/55gk2rcmfc6p2dg9u9ohc3hw9/gradle-3.3-all.zi
  19. git gui :Updating the Git index failed. A rescan will be automatically started to res
  20. js小数乘法精确率问题

热门文章

  1. 51nod 范德蒙矩阵
  2. D3.js力导向图(适用于其他类型图)中后添加元素遮盖已有元素的问题解决
  3. 相似文本文档分析之SimHash算法
  4. HDU - 4289 Control (Dinic)
  5. 2019 ICPC 陕西西安邀请赛 D. Miku and Generals
  6. ssh批量免密
  7. POJ 2976 Dropping tests [二分]
  8. Django框架之中间件MiddleWare
  9. 基于python的二分搜索和例题
  10. k8s集群———flannel网络