网上关于Scracpy的讲述已经非常丰富了,而且还有大神翻译的官方文档,我就不重复造轮子了,自己写了一个小爬虫,遇到不少坑,也学到不少东西,在这里给大家分享一下,自己也做个备忘录。

主要功能就是爬取cnvd漏洞库每个漏洞的名称、发布时间,漏洞描述,漏洞编号...

先说下我的环境:

Ubuntu 16.04
python 2.7
scracpy 1.0.3

1、Scracpy的如何自定义UA?

因为某些网站有根据ua做反爬机制,Scracpy已经为我们定义好了处理机制,首先在settings.py中设置处理request的类,然后实现类即可。

settings.py中增加如下内容

#网上找代码,有侵权请通知
WNLOADER_MIDDLEWARES = {
'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware':None,
#工程名(cnvd)、类文件名(middlewares)、文件中类名(RotateUserAgentMiddleware)
'cnvd.middlewares.RotateUserAgentMiddleware':400,
}

在同目录下新建文件Middlewares.py,代码如下

#网上找的代码,有侵权请告知

#!/usr/bin/python
#-*-coding:utf-8-*- import random
from scrapy.downloadermiddlewares.useragent import UserAgentMiddleware class RotateUserAgentMiddleware(UserAgentMiddleware):
def __init__(self, user_agent=''):
self.user_agent = user_agent def process_request(self, request, spider):
#随机选择list中的ua
ua = random.choice(self.user_agent_list)
if ua:
#设置request头部中的ua信息
request.headers.setdefault('User-Agent', ua) #the default user_agent_list composes chrome,I E,firefox,Mozilla,opera,netscape
#for more user agent strings,you can find it in http://www.useragentstring.com/pages/useragentstring.php
user_agent_list = [\
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1"\
"Mozilla/5.0 (X11; CrOS i686 2268.111.0) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11",\
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1092.0 Safari/536.6",\
"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1090.0 Safari/536.6",\
"Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/19.77.34.5 Safari/537.1",\
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.9 Safari/536.5",\
"Mozilla/5.0 (Windows NT 6.0) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.36 Safari/536.5",\
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",\
"Mozilla/5.0 (Windows NT 5.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",\
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_0) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",\
"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",\
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",\
"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",\
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",\
"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",\
"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.0 Safari/536.3",\
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24",\
"Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24"
]

2、Scracpy中log怎么用?

在网上搜索和官方例子中用的是log.msg("log msg", level=DEBUG),但是自己使用的时候提示该方法已经被废弃,建议使用python的logging模块。使用方法如下

import logging

logging.debug("msg")

3、yield什么意思

我对python也是一知半解,一直不明白这个是怎么个用法,也说不好,看代码注释吧

#Scracpy会自动向url发一个请求,并使用index_parse解析response
yield scrapy.Request(url, callback=self.index_parse)
#实现回调函数
def index_parse(self, response):

4、Xpath的一些小知识

#获得a标签的href属性值
response.xpath(//tr[@class='current']/td/a/@href)
#查找文本是xxx的标签/对与查找汉字,需要在字符串前加u
response.xpath(u"//td[text()='漏洞描述'])
#找到当前节点的所有兄弟节点
response.xpath(u"//td[text()='漏洞描述']/following-sibling::*")

测试xpath的方法:

1、使用scracpy shell url,会返回一个交互终端,可以使用response.xpath("")查看该url页面的匹配结果。个人不喜欢这种方式,终端操作,不好看。

2、使用firefox插件WebDriver Element Locator,安装之后,当在页面选中元素右击,可以看到该元素的xpath,然并卵,大多时候不是我们想要的方式

3、使用firefox插件firebug,firexpath,在firebug页面会出现一个firepath的框,输入xpath可以测试匹配是否成功,个人比较喜欢这种方式

5、数据库操作

直接上数据库操作的代码

import logging
from cnvd.items import CnvdItem
import MySQLdb
import MySQLdb.cursors class CnvdPipeline(object):
def __init__(self):
self.conn = MySQLdb.connect(user='root', passwd ='', db='cnvddb', host='localhost', charset='utf8')
self.cursor = self.conn.cursor()
self.cursor.execute("truncate table cnvd")
self.conn.commit()
def process_item(self, item, spider):
self.cursor.execute("insert into cnvd(cnvd_id, name, time, description) values(%s, %s, %s, %s)",
(item['cnvd_id'], item['name'], item['time'], item['description']))
self.conn.commit()
logging.debug(item['name'])
logging.debug(item['cnvd_id'])
logging.debug(item['time'])
return item

总结:

曾经使用urllib2写过一个爬虫爬cnnvd上的漏洞库,爬了一天发现网站漏洞页面不能访问来,用手机4G可以访问,猜测是把公司的ip加入黑名单来,本来想用scracpy再实现一个,奈何页面打不开,不好调试。于是选择来cnvd这个漏洞库,不过测试也仅仅是用了一页,没有全爬,担心再被拉黑。各位测试的时候最好也注意一下。。。

附件是完整的代码,仅仅是一个小demo,后来要做的还有数据库查重,反反爬,漏洞其他信息的爬取等等,但是作为一个demo,够用了

完整代码

Scrapy爬虫入门实例的更多相关文章

  1. Scrapy爬虫入门系列3 将抓取到的数据存入数据库与验证数据有效性

    抓取到的item 会被发送到Item Pipeline进行处理 Item Pipeline常用于 cleansing HTML data validating scraped data (checki ...

  2. Python Scrapy 爬虫框架实例(一)

    之前有介绍 scrapy 的相关知识,但是没有介绍相关实例,在这里做个小例,供大家参考学习. 注:后续不强调python 版本,默认即为python3.x. 爬取目标 这里简单找一个图片网站,获取图片 ...

  3. Python Scrapy 爬虫框架实例

    之前有介绍 scrapy 的相关知识,但是没有介绍相关实例,在这里做个小例,供大家参考学习. 注:后续不强调python 版本,默认即为python3.x. 爬取目标 这里简单找一个图片网站,获取图片 ...

  4. 10个python爬虫入门实例

    昨天和伙伴萌一块学习,写了几个简单的入门实例 涉及主要知识点: web是如何交互的 requests库的get.post函数的应用 response对象的相关函数,属性 python文件的打开,保存 ...

  5. Scrapy 爬虫入门 +实战

    爬虫,其实很早就有涉及到这个点,但是一直没有深入,今天来搞爬虫.选择了,scrapy这个框架 http://scrapy-chs.readthedocs.io/zh_CN/0.24/intro/tut ...

  6. scrapy爬虫框架实例二

    本实例主要通过抓取慕课网的课程信息来展示scrapy框架抓取数据的过程. 1.抓取网站情况介绍 抓取网站:http://www.imooc.com/course/list 抓取内容:要抓取的内容是全部 ...

  7. Scrapy爬虫入门Request和Response(请求和响应)

    开发环境:Python 3.6.0 版本 (当前最新)Scrapy 1.3.2 版本 (当前最新) 请求和响应 Scrapy的Request和Response对象用于爬网网站. 通常,Request对 ...

  8. Python 爬虫入门实例(爬取小米应用商店的top应用apk)

    一,爬虫是什么? 爬虫就是获取网络上各种资源,数据的一种工具.具体的可以自行百度. 二,如何写简单爬虫 1,获取网页内容 可以通过 Python(3.x) 自带的 urllib,来实现网页内容的下载. ...

  9. scrapy爬虫框架实例一,爬取自己博客

    本篇就是利用scrapy框架来抓取本人的博客,博客地址:http://www.cnblogs.com/shaosks scrapy框架是个比较简单易用基于python的爬虫框架,相关文档:http:/ ...

随机推荐

  1. PHP的数据加密解密

    本文出至:新太潮流网络博客 /** * [对数据进行加密] * @E-mial wuliqiang_aa@163.com * @TIME 2017-04-07 * @WEB http://blog.i ...

  2. RHEL7系统管理常用工具

    RHEL7提供大量系统管理工具,简要记录一下各工具的作用,后续再详细说明用法. 工具 描述 /proc linux的内存镜像目录./proc/sys目录下的文件能被临时修改,从而改变linux内核参数 ...

  3. MFC 常用功能总结

    目录 ◆ 获取启动参数◆ 调整窗体大小◆ 关闭Dialog窗体◆ Dialog启动时指定控件为焦点◆ Dialog中禁止ESC回车关闭窗体◆ 回车后焦点自动跳到下一个控件◆ 窗体中某个控件捕获右键菜单 ...

  4. 为什么ConcurrentHashMap的读操作不需要加锁?

    我们知道,ConcurrentHashmap(1.8)这个并发集合框架是线程安全的,当你看到源码的get操作时,会发现get操作全程是没有加任何锁的,这也是这篇博文讨论的问题--为什么它不需要加锁呢? ...

  5. Springboot连接MySQL8.0出现的问题

    以前用的是5.7版本的MySQL,在学习实践Springboot的时候顺带升级了一下8.0,遇到了一些坑,在这记录一下,有碰到同类问题的童鞋需要自取. 使用 navicat连接发现报错1251- Cl ...

  6. Codding.net 与 Visual Studio 项目的创建和上传 push 403错误

    1.在codding项目里创建一个项目,记住http 箭头的链接 2.克隆-----第一个框放入上面保存的链接, 下面的框选择一个空文件夹,选好后 克隆就OK 3.在 第2步NewRepo2 文件夹里 ...

  7. 【Ansible 文档】【译文】配置文件

    这里说明一下配置文件的内容,原文地址:http://docs.ansible.com/ansible/latest/intro_configuration.html 这个与[Ansible 文档]配置 ...

  8. Secure Shell相关设置

    1.清空known hosts记录 ctrl+shift+j调出js控制台后,输入: term_.command.removeAllKnownHosts()

  9. BZOJ3632:外太空旅行(最大团,DFS)

    Description 在人类的触角伸向银河系的边缘之际,普通人上太空旅行已经变得稀松平常了.某理科试验班有n个人,现在班主任要从中选出尽量多的人去参加一次太空旅行活动. 可是n名同学并不是和平相处的 ...

  10. 基于VC++ Win32+CUDA+OpenGL组合与VC++ MFC SDI+CUDA+OpenGL组合两种方案的遥感影像显示:获得的重要结论!

    1.基于VC++ Win32+CUDA+OpenGL组合的遥感影像显示 在该组合方案下,初始化时将OpenGL设置为下面两种方式,效果一样 //设置方式1 glutInitDisplayMode (G ...