Scrapy学习笔记(5)-CrawlSpider+sqlalchemy实战
基础知识
实践
有了前面的知识和基本概念之后,下面就是写代码了,本文目标是使用CrawlSpider和sqlalchemy实现如下网站中的高匿代理IP采集入库http://ip84.com,新建项目和spider的过程我就不写了,不会的可以参考之前的文章,本次项目名称为”ip_proxy_pool”,顾名思义就是IP代理池,学习爬虫的应该都知道,不过本文仅仅是采集特定网站公开的代理IP,维护一个IP代理池那是后话,OK,Talk is cheap,Show you the code!

项目结构如上图所示,model目录存放数据库表的映射文件,proxy.py是目标表的映射文件,rules.py以及和model目录同级的__init__.py文件本文中暂时用不到先不管,其他文件都是本次实践需要用到的。
1.items.py
# -*- coding: utf-8 -*- # Define here the models for your scraped items
#
# See documentation in:
# http://doc.scrapy.org/en/latest/topics/items.html import scrapy class IpProxyPoolItem(scrapy.Item): ip_port = scrapy.Field()
type = scrapy.Field()
level = scrapy.Field()
country = scrapy.Field()
location = scrapy.Field()
speed = scrapy.Field()
source = scrapy.Field()
2.model目录下的__init__.py
# -*- coding: utf-8 -*-
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker # 创建对象的基类:
Base = declarative_base() # 初始化数据库连接:
engine = create_engine('mysql+mysqldb://root:123456@localhost:3306/scrapy?charset=utf8') #返回数据库会话
def loadSession():
Session = sessionmaker(bind=engine)
session = Session()
return session
3.proxy.py(数据库表proxies的映射文件)
# -*- coding: utf-8 -*-
from sqlalchemy import Column,String,Integer,DateTime from . import Base
import datetime
class Proxy(Base):
__tablename__ = 'proxies' ip_port=Column(String(30),primary_key=True,nullable=False)
type=Column(String(20),nullable=True)
level=Column(String(20),nullable=True)
location=Column(String(100),nullable=True)
speed=Column(Integer,nullable=True)
source = Column(String(500), nullable=False)
indate=Column(DateTime,nullable=False) def __init__(self,ip_port,source,type=None,level=None,location=None,speed=None):
self.ip_port=ip_port
self.type=type
self.level=level
self.location=location
self.speed=speed
self.source=source
self.indate=datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
4.pipelines.py
# -*- coding: utf-8 -*- # Define your item pipelines here
from model import Base,engine,loadSession
from model import proxy class IpProxyPoolPipeline(object):
#搜索Base的所有子类,并在数据库中生成表
Base.metadata.create_all(engine) def process_item(self, item, spider):
a = proxy.Proxy(
ip_port=item['ip_port'],
type=item['type'],
level=item['level'],
location=item['location'],
speed=item['speed'],
source=item['source']
)
session = loadSession()
session.add(a)
session.commit()
return item
5.proxy_spider.py
# -*- coding: utf-8 -*-
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from ..items import IpProxyPoolItem class ProxySpiderSpider(CrawlSpider): name = 'proxy_spider'
allowed_domains = ['ip84.com']
start_urls = ['http://ip84.com/gn'] rules = (
#跟随下一页链接
Rule(LinkExtractor(restrict_xpaths="//a[@class='next_page']"),follow=True),
#对所有链接中含有"/gn/数字"的链接调用parse_item函数进行数据提取并过滤重复链接
Rule(LinkExtractor(allow=r'/gn/\d+',unique=True), callback='parse_item'),
) def parse_item(self, response):
print 'Hi, this is an item page! %s' % response.url
item=IpProxyPoolItem() for proxy in response.xpath("//table[@class='list']/tr[position()>1]"): ip=proxy.xpath("td[1]/text()").extract_first()
port=proxy.xpath("td[2]/text()").extract_first()
location1=proxy.xpath("td[3]/a[1]/text()").extract_first()
location2=proxy.xpath("td[3]/a[2]/text()").extract_first()
level=proxy.xpath("td[4]/text()").extract_first()
type = proxy.xpath("td[5]/text()").extract_first()
speed=proxy.xpath("td[6]/text()").extract_first()
item['ip_port']=(ip if ip else "")+":"+(port if port else "")
item['type']=(type if type else "")
item['level']=(level if level else "")
item['location']=(location1 if location1 else "")+" "+(location2 if location2 else "")
item['speed']=(speed if speed else "")
item['source']=response.url
return item
6.settings.py
# -*- coding: utf-8 -*- # Scrapy settings for ip_proxy_pool project BOT_NAME = 'ip_proxy_pool' SPIDER_MODULES = ['ip_proxy_pool.spiders']
NEWSPIDER_MODULE = 'ip_proxy_pool.spiders' # Obey robots.txt rules
ROBOTSTXT_OBEY = True ITEM_PIPELINES = {
'ip_proxy_pool.pipelines.IpProxyPoolPipeline': 300,
} DOWNLOAD_DELAY = 2
7.运行spider,查看结果

Scrapy学习笔记(5)-CrawlSpider+sqlalchemy实战的更多相关文章
- Scrapy:学习笔记(2)——Scrapy项目
Scrapy:学习笔记(2)——Scrapy项目 1.创建项目 创建一个Scrapy项目,并将其命名为“demo” scrapy startproject demo cd demo 稍等片刻后,Scr ...
- Scrapy:学习笔记(1)——XPath
Scrapy:学习笔记(1)——XPath 1.快速开始 XPath是一种可以快速在HTML文档中选择并抽取元素.属性和文本的方法. 在Chrome,打开开发者工具,可以使用$x工具函数来使用XPat ...
- scrapy 学习笔记1
最近一段时间开始研究爬虫,后续陆续更新学习笔记 爬虫,说白了就是获取一个网页的html页面,然后从里面获取你想要的东西,复杂一点的还有: 反爬技术(人家网页不让你爬,爬虫对服务器负载很大) 爬虫框架( ...
- 爱了!阿里大神最佳总结“Flutter进阶学习笔记”,理论与实战
前言 "小步快跑.快速迭代"的开发大环境下,"一套代码.多端运行"是很多开发团队的梦想,美团也一样.他们做了很多跨平台开发框架的尝试:React Native. ...
- Python--网络编程学习笔记系列01 附实战:udp聊天器
Python--网络编程学习系列笔记01 网络编程基本目标: 不同的电脑上的软件能够实现数据传输 网络编程基础知识: IP地址: 用来在网络中标记一台电脑 网络号+主机号(按网络号和主机号占位分类A ...
- Angular 4 学习笔记 从入门到实战 打造在线竞拍网站 基础知识 快速入门 个人感悟
最近搞到手了一部Angular4的视频教程,这几天正好有时间变学了一下,可以用来做一些前后端分离的网站,也可以直接去打包web app. 环境&版本信息声明 运行ng -v @angular/ ...
- Angular4.0学习笔记 从入门到实战打造在线竞拍网站学习笔记之二--路由
Angular4.0基础知识见上一篇博客 路由 简介 接下来学习路由的相关知识 本来是不准备写下去的,因为当时看视频学的时候感觉自己掌握的不错 ( 这是一个灰常不好的想法 ) ,过了一段时间才发现An ...
- scrapy学习笔记(1)
初探scrapy,发现很多入门教程对应的网址都失效或者改变布局了,走了很多弯路.于是自己摸索做一个笔记. 环境是win10 python3.6(anaconda). 安装 pip install sc ...
- scrapy 学习笔记2
本章学习爬虫的 回调和跟踪链接 使用参数 回调和跟踪链接 上一篇的另一个爬虫,这次是为了抓取作者信息 # -*- coding: utf-8 -*- import scrapy class Myspi ...
随机推荐
- 【Python】-NO.99.Note.4.Python -【Python3 条件语句 循环语句】
1.0.0 Summary Tittle:[Python]-NO.99.Note.4.Python -[Python3 条件语句 循环语句] Style:Python Series:Python Si ...
- Ext.create细节分析
var win1 = Ext.create('Ext.window.Window', { //实例化方法四 : 使用 完整的 Extjs 类名 width: 800, title: 'define t ...
- [ErrorException] "continue" targeting switch is equivalent to "break". Did you mean to use "continue 2"?
Mac上PHP更新到7.3,使用Composer报这个错误 解决办法: composer selfupdate
- centos下安卓构建打包太慢
最近不清楚什么情况,在linux下构建安卓打包时,很慢,很慢...... 之前还是好好的,一个构建三四分钟,现在尽然要两三个小时,人都要崩溃了.... 当时据说公司用的联通网有问题了,正在处理,可是网 ...
- 增删改(DML)操作
增删改(DML)操作 1.1事务(transaction) 事务是数据库操作的最小单元,又ACID的特性,应该保证一个事务的sql语句要么同时成功,要么都不成功. Mybatis中配置了事务管理器,t ...
- ANTLR4权威指南 - 第5章 设计语法
在第I部分,我们熟悉了ANTLR,并在一个比较高的层次上了解了语法以及语言程序.现在,我们将要放慢速度来学习下实现更实用任务的一些细节上的技巧,例如建立内部数据结构,提取信息,生成输入对应的翻译内容等 ...
- MFC 运行报错:Debug Assertion Failed! dbgheap.c
对话框已调用DestroyWindow 时,在调用delete this导致
- 正则表达式中\b和\s有什么区别
字符串:abcsdsadas abc asdsadasdabcasdsa使用\sabc\s和\babc\b都能匹配中间的abc,这种方法不是重复了么,/s是匹配空格回车等得,/b网上教程说得不清楚什么 ...
- MYSQLi数据访问批量删除
<link href="../bootstrap.min.css" rel="stylesheet" type="text/css" ...
- <6>Lua元表和冒号 self
Lua中没有像C.C++.JAVA中的类概念,面向对象等 ,但我们可以模拟出来 1. Lua中有个很重要的概念元表 设置元表setmetatable()函数 获取元表getmetatable()函数 ...