Scrapy爬虫工程设计

2024-06-04 20:38
文章标签 scrapy 爬虫 工程设计

本文主要是介绍Scrapy爬虫工程设计,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

最近做了一些爬虫的工作,并涉及到了工程的部署和自动化,借此机会整理一下,工程结构如图:

 

image.png

工程主要包含4个部分:

  • 获取有效代理ip
  • 数据管理
  • 不同任务的spider
  • spider在线调度和管理

1.获取有效代理ip

代理IP可从国内的几个网站爬取,如西刺。可以肯定免费的代理IP大部分都是不能用的,不然别人为什么还提供付费的(不过事实是很多代理商的付费IP也不稳定,也有很多是不能用)。所以采集回来的代理IP不能直接使用,需要写一个过滤程序去用这些代理访问目标网站,看是否可以正常使用。我的项目里所有爬虫任务都是每日定时开启的,所以爬取和过滤的过程被设计在了一个spider中,主任务开启的前三个小时执行 ,因为检测代理是个很慢的过程。

以西刺网站为例,创建任务spider:

 

class Proxy(Spider):name = "scrapy_proxy"#设置custom_settings,执行爬取代理ip的任务时不使用代理 custom_settings = {'DOWNLOADER_MIDDLEWARES' : {'scrapy.contrib.downloadermiddleware.httpproxy.HttpProxyMiddleware': 543,}}base_url = "http://www.xicidaili.com/nn/"def __init__(self, *a , **kw):super(Proxy, self).__init__(*a, **kw)self.sql = SqlHelper()#数据管理方法self.create_proxyurl_table()#创建存储有效代理ip的tabledef create_proxyurl_table(self):command = ("CREATE TABLE IF NOT EXISTS {} (""`id` INT(8) NOT NULL AUTO_INCREMENT,""`url` TEXT(20) NOT NULL ,""`create_time` DATETIME NOT NULL,""PRIMARY KEY(id)"") ENGINE=InnoDB".format(config.proxy_url_table))self.sql.create_table(command)

爬取前10页的IP:

 

    def start_requests(self):for i in range(1,10):url = self.base_url + str(i)yield Request(url = url,headers = {'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8','Accept-Encoding': 'gzip, deflate, sdch','Accept-Language': 'zh-CN,zh;q=0.8,en;q=0.6','Connection': 'keep-alive','Host': 'www.xicidaili.com','Upgrade-Insecure-Requests': '1','User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:51.0) Gecko/20100101 Firefox/51.0',},callback = self.parse_all,errback = self.error_parse)

解析内容,验证IP有效性,并存储

 

    def parse_all(self,response):proxys = response.xpath("//table[@id='ip_list']/tr").extract()for i ,proxy in enumerate(proxys):if i==0 :continuesel = Selector(text = proxy)ip = sel.xpath("//td[2]/text()").extract_first()port = sel.xpath("//td[3]/text()").extract_first()speed = sel.xpath("//td[7]/div[@class='bar']/@title").extract_first().replace('秒','')connect = sel.xpath("//td[8]/div[@class='bar']/@title").extract_first().replace('秒','')proxy = str(ip) + ':'+str(port)self.validateIP(proxy)def validateIP(self,proxy):try:requests.post('目标网站地址',proxies={"http":proxy},timeout=10)except:util.log(proxy + '  connect failed')else:util.log("grab ip :%s" % (proxy))dt = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")msg = (None,proxy,dt)command = ("INSERT IGNORE INTO {}""(id,url,create_time)""VALUES(%s,%s,%s)".format(config.proxy_url_table))self.sql.insert_data(command, msg)

2.数据存储

创建一个工具类,包含常用的建表,查询,插值等操作

 

#-*- coding: utf-8 -*-import logging
import mysql.connector
import utils
import configfrom singleton import Singletonclass SqlHelper(Singleton):def __init__(self):self.database_name = config.development_database_nameself.init()def init(self):self.database = mysql.connector.connect(**config.development_database_config)self.cursor = self.database.cursor()self.create_database()self.database.database = self.database_namedef create_database(self):try:command = 'CREATE DATABASE IF NOT EXISTS %s DEFAULT CHARACTER SET \'utf8\' ' % self.database_nameutils.log('sql helper create_database command:%s' % command)self.cursor.execute(command)except Exception, e:utils.log('SqlHelper create_database exception:%s' % str(e), logging.WARNING)def create_table(self, command):try:utils.log('sql helper create_table command:%s' % command)self.cursor.execute(command)self.database.commit()except Exception, e:utils.log('sql helper create_table exception:%s' % str(e), logging.WARNING)def insert_data(self, command, data):try:#utils.log('insert_data command:%s, data:%s' % (command, data))self.cursor.execute(command, data)self.database.commit()except Exception, e:utils.log('sql helper insert_data exception msg:%s' % str(e), logging.WARNING)def execute(self, command):try:utils.log('sql helper execute command:%s' % command)data = self.cursor.execute(command)self.database.commit()return dataexcept Exception, e:utils.log('sql helper execute exception msg:%s' % str(e))return Nonedef query(self, command):try:#utils.log('sql helper execute command:%s' % command)self.cursor.execute(command)data = self.cursor.fetchall()return dataexcept Exception, e:utils.log('sql helper execute exception msg:%s' % str(e))return Nonedef query_one(self, command):try:utils.log('sql helper execute command:%s' % command)self.cursor.execute(command)data = self.cursor.fetchone()return dataexcept Exception, e:utils.log('sql helper execute exception msg:%s' % str(e))return None

3. Spiders

关于Scrapy相关的基础知识,请查阅Python系列文章

4.Spider在线调度和管理

SpiderKeeper是一个scrapy的管理后台,基于Scrapyd和Flask。界面如下:

 

image.png

 

主要功能包括:

  • Job Dashboard
  • Periodic Jobs
  • Deploy
  • Running Stats
  • Manage



作者:SamDing
链接:https://www.jianshu.com/p/b360f53930e7
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

这篇关于Scrapy爬虫工程设计的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1031064

相关文章

Python3 BeautifulSoup爬虫 POJ自动提交

POJ 提交代码采用Base64加密方式 import http.cookiejarimport loggingimport urllib.parseimport urllib.requestimport base64from bs4 import BeautifulSoupfrom submitcode import SubmitCodeclass SubmitPoj():de

Python:豆瓣电影商业数据分析-爬取全数据【附带爬虫豆瓣,数据处理过程,数据分析,可视化,以及完整PPT报告】

**爬取豆瓣电影信息,分析近年电影行业的发展情况** 本文是完整的数据分析展现,代码有完整版,包含豆瓣电影爬取的具体方式【附带爬虫豆瓣,数据处理过程,数据分析,可视化,以及完整PPT报告】   最近MBA在学习《商业数据分析》,大实训作业给了数据要进行数据分析,所以先拿豆瓣电影练练手,网络上爬取豆瓣电影TOP250较多,但对于豆瓣电影全数据的爬取教程很少,所以我自己做一版。 目

Golang 网络爬虫框架gocolly/colly(五)

gcocolly+goquery可以非常好地抓取HTML页面中的数据,但碰到页面是由Javascript动态生成时,用goquery就显得捉襟见肘了。解决方法有很多种: 一,最笨拙但有效的方法是字符串处理,go语言string底层对应字节数组,复制任何长度的字符串的开销都很低廉,搜索性能比较高; 二,利用正则表达式,要提取的数据往往有明显的特征,所以正则表达式写起来比较简单,不必非常严谨; 三,使

Golang网络爬虫框架gocolly/colly(四)

爬虫靠演技,表演得越像浏览器,抓取数据越容易,这是我多年爬虫经验的感悟。回顾下个人的爬虫经历,共分三个阶段:第一阶段,09年左右开始接触爬虫,那时由于项目需要,要访问各大国际社交网站,Facebook,myspace,filcker,youtube等等,国际上叫得上名字的社交网站都爬过,大部分网站提供restful api,有些功能没有api,就只能用http抓包工具分析协议,自己爬;国内的优酷、

Golang网络爬虫框架gocolly/colly(三)

熟悉了《Golang 网络爬虫框架gocolly/colly 一》和《Golang 网络爬虫框架gocolly/colly 二》之后就可以在网络上爬取大部分数据了。本文接下来将爬取中证指数有限公司提供的行业市盈率。(http://www.csindex.com.cn/zh-CN/downloads/industry-price-earnings-ratio) 定义数据结构体: type Zhj

014.Python爬虫系列_解析练习

我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈 入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈 虚 拟 环 境 搭 建 :👉👉 Python项目虚拟环境(超详细讲解) 👈👈 PyQt5 系 列 教 程:👉👉 Python GUI(PyQt5)文章合集 👈👈 Oracle数据库教程:👉👉 Oracle数据库文章合集 👈👈 优

urllib与requests爬虫简介

urllib与requests爬虫简介 – 潘登同学的爬虫笔记 文章目录 urllib与requests爬虫简介 -- 潘登同学的爬虫笔记第一个爬虫程序 urllib的基本使用Request对象的使用urllib发送get请求实战-喜马拉雅网站 urllib发送post请求 动态页面获取数据请求 SSL证书验证伪装自己的爬虫-请求头 urllib的底层原理伪装自己的爬虫-设置代理爬虫coo

Python 爬虫入门 - 基础数据采集

Python网络爬虫是一种强大且灵活的工具,用于从互联网上自动化地获取和处理数据。无论你是数据科学家、市场分析师,还是一个想要深入了解互联网数据的开发者,掌握网络爬虫技术都将为你打开一扇通向丰富数据资源的大门。 在本教程中,我们将从基本概念入手,逐步深入了解如何构建和优化网络爬虫,涵盖从发送请求、解析网页结构到保存数据的全过程,并讨论如何应对常见的反爬虫机制。通过本教程,你将能够构建有效的网络爬

0基础学习爬虫系列:网页内容爬取

1.背景 今天我们来实现,监控网站最新数据爬虫。 在信息爆炸的年代,能够有一个爬虫帮你,将你感兴趣的最新消息推送给你,能够帮你节约非常多时间,同时确保不会miss重要信息。 爬虫应用场景: 应用场景主要功能数据来源示例使用目的搜索引擎优化 (SEO)分析关键词密度、外部链接质量等网站元数据、链接提升网站在搜索引擎中的排名市场研究收集竞品信息、价格比较电商网站、行业报告制定更有效的市场策略舆情

0基础学习爬虫系列:程序打包部署

1.目标 将已经写好的python代码,打包独立部署或运营。 2. 环境准备 1)通义千问 :https://tongyi.aliyun.com/qianwen 2)0基础学习爬虫系列–网页内容爬取:https://blog.csdn.net/qq_36918149/article/details/141998185?spm=1001.2014.3001.5502 3. 步骤 1)不知道