爬虫学习笔记,运营学python之爬虫高档篇
分类:计算机编程

1. Scrapy框架

  Scrapy是python下落成爬虫功效的框架,能够将数据深入分析、数据管理、数据存款和储蓄合为生龙活虎体功用的爬虫框架。

Scrapy是贰个应用程序框架,用于抓取web站点和领取布局化数据,那么些数量足以用来大面积的使用,如数据发现、消息处理。固然Scrapy最先是为web抓取而设计的,但它也能够利用api(譬如AmazonAssociates的web服务卡塔尔(英语:State of Qatar)或作为三个通用的web爬虫程序来领取数额。

这是本人要辛亏读书python 3爬虫时的小笔记,做备忘用,难免会有部分荒谬和脱漏,望指正~~~
Python 3 爬虫学习笔记 (黄金时代)
Python 3 爬虫学习笔记 (二)
Python 3 爬虫学习笔记 (三)
Python 3 爬虫学习笔记 (四)
Python 3 爬虫学习笔记 (六)

2. Scrapy安装

1 情状设置

开始时期Scrapy是不帮忙python3的,现在已经支撑了,所以大家根本依然接纳python3来贯彻。


1. 装置信赖包

yum install gcc libffi-devel python-devel openssl-devel -y
yum install libxslt-devel -y

1.1Ubuntu 14.04 或以上版本安装

重大注意相关依赖包此外linux版本基本雷同(会玩linux,那几个都是小菜一碟,十分的少讲明)

sudo apt-get install python-dev python-pip libxml2-dev libxslt1-dev zlib1g-dev libffi-dev libssl-dev

sudo apt-get install python3 python3-dev

pip install scrapy

六、Scrapy初体验

事情发生前大约学习了下通过urllib和Beautiful Soup 举办简短多少爬取的流程,不过那只适用于部分归纳的、数据量相当小的爬虫项目,假若急需爬取的数据量相当的大的话,在此之前的艺术自然特别缓慢,所以就有了Scrapy,Scrapy是多个火速的web抓取框架,可抓取web站点并从页面中领到构造化的数量。Scrapy给大家提供了比很多的爬虫基类,大家得以生龙活虎间接轨使用,当然,既然Scrapy是三个框架,大家也足以依照自身的供给对它进行更改,下边大家就逐步来看Scrapy的运用。

Scrapy is an application framework for crawling web sites and extracting structured data which can be used for a wide range of useful applications, like data mining, information processing or historical archival.
Even though Scrapy was originally designed for web scraping, it can also be used to extract data using APIs (such as Amazon Associates Web Services ) or as a general purpose web crawler.

 2. 安装scrapy

pip install scrapy
pip install twisted==13.1.0

 注意事项:scrapy和twisted存在宽容性难题,假设设置twisted版本过高,运营scrapy startproject project_name的时候会提示报错,安装twisted==13.1.0就能够。

1.2 windows上安装

windows上设置微微复杂一点,首先要安装Anaconda,Anaconda下载地址:
百度网盘下载 密码:3kjd 官方网站下载地址
Anaconda安装很简短,正是下一步,下一步就可以,安装完后应当要记得配置情状变量,不然也会出错,配置步骤如下:
图片 1
循途守辙箭头方向配置就能够,注意Anaconda安装的路线要与您的装置路线对应。配置达成后间接cmd,后运营命令:

conda install  scrapy

如下图:
图片 2
选择Y回车
图片 3
Scrapy就安装实现了。

(一)安装(Windows)

Scrapy是纯Python编写的,所以须求有些相比较关键的的Python注重包:

  • lxml, an efficient XML and HTML parser
  • parsel, an HTML/XML data extraction library written on top of lxml,
  • w3lib, a multi-purpose helper for dealing with URLs and web page encodings
  • twisted, an asynchronous networking framework
  • cryptography and pyOpenSSL, to deal with various network-level security needs

望着信任包很多,其实安装起来并不复杂,以管理人的身份运营Windows命令提醒符,在以安装Python的前提下,运转:

pip install scrapy

pip会自动下载相关信赖包,假设顺遂的话,会一向设置到位。

要注意的是,确认一下python的本子,pip会依据系统活动安装相关包,即假使系统是六十一个人的,pip就能够设置陆十三位的包,但是twisted的版本必要求和python的相像,要是操作系统是62人的,python是三十三位的,pip间接设置的twisted安装就能够出错。

设若pip安装twisted时出错,在命令行输入python,查看本地python版本,然后到这里下载和python版本相符的whl文件,使用pip install xxx.whl安装,实现后再试行二遍pip install scrapy即可。

在命令行输入scrapy, 若不报错,则设置到位。

3. 依照Scrapy爬取数据并存入到CSV

3.1. 爬虫指标,获取简书中火热专项论题的多少音信,站点为

图片 4

2 Scrapy使用

(二) 第一个Scrapy项目

如故,先上官方文档 1.3,找了瞬间网络翻译的文书档案都以0.24依旧0.24版,所以建议大家要么看官方最新的德语版比较好。

展开命令提醒符,步入想要创造项指标目录,运转

scrapy startproject scrapyTest

Paste_Image.png

体系开创完结,让大家来看一下档期的顺序组织,实施:

tree /f

Paste_Image.png

└─scrapyTest
    │  scrapy.cfg           # 配置文件(deploy configuration file)
    │
    └─scrapyTest
        │  items.py         # 项目中的item文件(project items definition file)
        │  middlewares.py   # 中间件
        │  pipelines.py     # 项目中的管道文件(project pipelines file)
        │  settings.py      # 项目中的设置文件(project settings file)
        │  __init__.py
        │
        ├─spiders           # 存放爬虫的文件夹(a directory where you'll later put your spiders)
        │  │  __init__.py
        │  │
        │  └─__pycache__
        └─__pycache__

进入spiders目录,新建test_spider.py如下:

# -*- coding:utf-8 -*-

import scrapy
from bs4 import BeautifulSoup


class tsSpride(scrapy.Spider):
    name = 'test' # 爬虫的唯一名字,在项目中爬虫名字一定不能重复

    # start_requests() 必须返回一个迭代的Request
    def start_requests(self):
        # 待爬取的URL列表
        urls = ['http://www.jianshu.com/',]
        # 模拟浏览器
        headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'}
        for url in urls:
            yield scrapy.Request(url=url, headers=headers, callback=self.parse)

    # 处理每个请求的下载响应
    def parse(self, response):
        soup = BeautifulSoup(response.body, 'html.parser')
        titles = soup.find_all('a', 'title')
        for title in titles:
            print(title.string)

在命令行输入

scrapy crawl test

结果如下:

Paste_Image.png

上述代码Scrapy为start_requests 中的每一个URubiconL创造了scrapy.Request对象,并将 parse(卡塔尔(英语:State of Qatar)方法作为回调函数(callback卡塔尔(قطر‎赋值给了Request(Scray中parse(卡塔尔为暗许回调方法)。

The parse() method will be called to handle each of the requests for those URLs, even though we haven’t explicitly told Scrapy to do so. This happens because parse() is Scrapy’s default callback method, which is called for requests without an explicitly assigned callback.

地点代码中用了Beautiful Soup来管理爬下来的数码,而Scrapy也可以有Selector来拍卖数量,前天先到那边,后一次再用八个切实的小项目来更详实地介绍Scrapy。

3.2. 爬取内容

  要求爬取专项论题的剧情囊括:专题内容、专题描述、收音和录音文章数、关心人数,Scrapy使用xpath来洗刷所需的数目,编写爬虫过程中能够手动通过lxml中的xpath获取数据,确认无误后再将其写入到scrapy代码中,差异点在于,scrapy必要使用extract(卡塔尔国函数工夫将数据提抽出来。

2.1 创建二个项目

在始发爬取以前,您必得创制叁个新的Scrapy项目。 步入你希图存款和储蓄代码的目录中,运维下列命令:

scrapy startproject tutorial

如图:
图片 5
创办达成后的目录构造如下:
图片 6

3.3 成立爬虫项目

[root@HappyLau jianshu_hot_topic]# scrapy startproject jianshu_hot_topic

#项目目录结构如下:
[root@HappyLau python]# tree jianshu_hot_topic
jianshu_hot_topic
├── jianshu_hot_topic
│   ├── __init__.py
│   ├── __init__.pyc
│   ├── items.py
│   ├── items.pyc
│   ├── middlewares.py
│   ├── pipelines.py
│   ├── pipelines.pyc
│   ├── settings.py
│   ├── settings.pyc
│   └── spiders
│       ├── collection.py
│       ├── collection.pyc
│       ├── __init__.py
│       ├── __init__.pyc
│       ├── jianshu_hot_topic_spider.py    #手动创建文件,用于爬虫数据提取
│       └── jianshu_hot_topic_spider.pyc
└── scrapy.cfg

2 directories, 16 files
[root@HappyLau python]# 

2.2 pycharm中调试scrapy代码

即使在pycharm中调和scrapy,需求设置scrapy,在设置scrapy以前还也可能有多少个依靠文件也要设置,如下:

  • zope.interface
  • pyOpenSSL
  • twisted 小编下载的本子地址 越多版本地址
  • liblxml2dom
  • lxml

twisted报错
那一个包都能够用pycharm插件工具安装,但里边设置twisted时候会师世报错,报错内容差不离如下:

building 'twisted.test.raiser' extension
error: Microsoft Visual C   14.0 is required. Get it with "Microsoft Visual C   Build Tools": http://landinghub.visualstudio.com/visual-cpp-build-tools

twisted报错撤消办法如下:

下载twisted对应版本的whl文件(如我的Twisted‑17.5.0‑cp36‑cp36m‑win_amd64.whl)下载地址上文已经给出,cp后面是python版本,amd64代表64位,运行命令,注意Twisted文件的路径:
pip install Twisted-17.5.0-cp36-cp36m-win_amd64.whl

减轻地点报错后在pip install scrapy就OK了。

pycharm不或然直接调节和测验scrapy
pycharm是回天无力直接调节和测量试验scrapy的,须求我们在品种中做一些配备,配置如下图:
图片 7
图一
图一中quotes_spider.py名称是你和谐定义的,类中的name = "quotes"名称也是自定义的
图片 8
图二
接下来在scrapy.cfg的同级目录下创设三个main.py文件,内容如上海图书馆,这里要在意cmdline.execute("scrapy crawl quotes".split(卡塔尔(قطر‎卡塔尔(قطر‎中的quotes要与图第一中学的name=“quotes”是应和的。每一回推行main.py就足以了。
quotes_spider.py代码如下:

import scrapy

class QuotesSpider(scrapy.Spider):
    name = "quotes"

    def start_requests(self):
        urls = [
            'http://quotes.toscrape.com/page/1/',
            'http://quotes.toscrape.com/page/2/',
        ]
        for url in urls:
            yield scrapy.Request(url=url, callback=self.parse)

    def parse(self, response):
        page = response.url.split("/")[-2]
        filename = 'quotes-%s.html' % page
        with open(filename, 'wb') as f:
            f.write(response.body)
        self.log('Saved file %s' % filename)

如上代码,大家的爬虫子类scrapy.Spider并定义了一些天性和格局:
name:标志爬虫。它必得在一个种类中是唯风流洒脱的,不可能为分歧的爬虫设置同风度翩翩的称谓。
start_requests(卡塔尔(英语:State of Qatar):必须回到三个可再度的伏乞(您能够回来三个伸手列表,也许编写八个生成器函数卡塔尔(英语:State of Qatar),那将使爬虫起头爬行。后续诉求将顺序从这一个初叶诉求中变化。
parse(卡塔尔(قطر‎:将调用三个主意来拍卖种种必要所下载的响应。响应参数是保存页面内容的TextResponse的多个实例,何况有更为的救助方法来拍卖它。parse(卡塔尔方法通常深入解析响应,提取深入分析的数量,并找到新的url来跟踪和开改善的乞求。
win32api报错
依照地点配置完结后,你会开掘提醒no module name win32api荒谬,这是因为从没设置win32的模块产生的
win32api报错消除办法
设置win32模块,安装有两种方法:
1.pycharm装置工具直接设置
2.下载win32包用pip install 包名 情势安装笔者下载的包 越来越多版本包
自己那边pycharm直接设置是没戏的,所以小编用的第三种安装方式

pip install pywin32-222-cp36-cp36m-win_amd64.whl 

安装完以后难题一下子就解决了,运维main.py后结果如下:
图片 9

 3.4 代码内容

1. items.py代码内容,定义需要爬取数据字段
# -*- coding: utf-8 -*-

# Define here the models for your scraped items
#
# See documentation in:
# https://doc.scrapy.org/en/latest/topics/items.html

import scrapy
from scrapy import Item
from scrapy import Field

class JianshuHotTopicItem(scrapy.Item):
 '''
 @scrapy.item,继承父类scrapy.Item的属性和方法,该类用于定义需要爬取数据的子段
 '''
 collection_name = Field()
 collection_description = Field()
 collection_article_count = Field()
 collection_attention_count = Field()

2. piders/jianshu_hot_topic_spider.py代码内容,实现数据获取的代码逻辑,通过xpath实现
[root@HappyLau jianshu_hot_topic]# cat spiders/jianshu_hot_topic_spider.py
#_*_ coding:utf8 _*_

import random
from time import sleep
from scrapy.spiders import CrawlSpider
from scrapy.selector import Selector
from scrapy.http import Request
from jianshu_hot_topic.items import JianshuHotTopicItem 

class jianshu_hot_topic(CrawlSpider):
 '''
 简书专题数据爬取,获取url地址中特定的子段信息
 '''
 name = "jianshu_hot_topic"
 start_urls = ["https://www.jianshu.com/recommendations/collections?page=2&order_by=hot"]

 def parse(self,response):
  '''
  @params:response,提取response中特定字段信息
  '''
  item = JianshuHotTopicItem()
  selector = Selector(response)
  collections = selector.xpath('//div[@class="col-xs-8"]') 
  for collection in collections:
   collection_name = collection.xpath('div/a/h4/text()').extract()[0].strip()
                 collection_description = collection.xpath('div/a/p/text()').extract()[0].strip()
                 collection_article_count = collection.xpath('div/div/a/text()').extract()[0].strip().replace('篇文章','')
                 collection_attention_count = collection.xpath('div/div/text()').extract()[0].strip().replace("人关注",'').replace("· ",'') 
   item['collection_name'] = collection_name
   item['collection_description'] = collection_description
   item['collection_article_count'] = collection_article_count 
   item['collection_attention_count'] = collection_attention_count

   yield item


  urls = ['https://www.jianshu.com/recommendations/collections?page={}&order_by=hot'.format(str(i)) for i in range(3,11)]
  for url in urls:
   sleep(random.randint(2,7))
   yield Request(url,callback=self.parse)

3. pipelines文件内容,定义数据存储的方式,此处定义数据存储的逻辑,可以将数据存储载MySQL数据库,MongoDB数据库,文件,CSV,Excel等存储介质中,如下以存储载CSV为例:
[root@HappyLau jianshu_hot_topic]# cat pipelines.py
# -*- coding: utf-8 -*-

# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://doc.scrapy.org/en/latest/topics/item-pipeline.html


import csv 

class JianshuHotTopicPipeline(object):
    def process_item(self, item, spider):
     f = file('/root/zhuanti.csv','a ')
 writer = csv.writer(f)
 writer.writerow((item['collection_name'],item['collection_description'],item['collection_article_count'],item['collection_attention_count']))
        return item

4. 修改settings文件,
ITEM_PIPELINES = { 
    'jianshu_hot_topic.pipelines.JianshuHotTopicPipeline': 300,
}

3 开始scrapy

 3.5 运行scrapy爬虫

  再次回到到项目scrapy项目开创所在目录,运行scrapy crawl spider_name即可,如下:

[root@HappyLau jianshu_hot_topic]# pwd
/root/python/jianshu_hot_topic
[root@HappyLau jianshu_hot_topic]# scrapy crawl jianshu_hot_topic
2018-02-24 19:12:23 [scrapy.utils.log] INFO: Scrapy 1.5.0 started (bot: jianshu_hot_topic)
2018-02-24 19:12:23 [scrapy.utils.log] INFO: Versions: lxml 3.2.1.0, libxml2 2.9.1, cssselect 1.0.3, parsel 1.4.0, w3lib 1.19.0, Twisted 13.1.0, Python 2.7.5 (default, Aug  4 2017, 00:39:18) - [GCC 4.8.5 20150623 (Red Hat 4.8.5-16)], pyOpenSSL 0.13.1 (OpenSSL 1.0.1e-fips 11 Feb 2013), cryptography 1.7.2, Platform Linux-3.10.0-693.el7.x86_64-x86_64-with-centos-7.4.1708-Core
2018-02-24 19:12:23 [scrapy.crawler] INFO: Overridden settings: {'NEWSPIDER_MODULE': 'jianshu_hot_topic.spiders', 'SPIDER_MODULES': ['jianshu_hot_topic.spiders'], 'ROBOTSTXT_OBEY': True, 'USER_AGENT': 'Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0', 'BOT_NAME': 'jianshu_hot_topic'}

 查看/root/zhuanti.csv中的数据,就可以达成。

 

3.1 scrapy流程及全体布局

试行完main.py后,检查当前目录中的文件,你应有专心到已经创办了多少个新文件:quotes-1.html和quotes-2.html,何况带有相应的url的原委。这通过scrapy是怎么着行事的呢?接下去大家讲一下scrapy的劳作流程及全体结构。下图描述了scrapy的构造及它的机件是怎样相互的:
图片 10

从上海教室能够看见scrapy中的数据流由试行引擎调整,流程如下:

  • 1.引擎(Engine卡塔尔(قطر‎获得初期早先的乞请,通过spiders去爬取;
  • 2.引擎(Engine卡塔尔(قطر‎在调治器(Scheduler卡塔尔国中调整央浼,并探索下一个呼吁去爬取;
  • 3.调整程序(Scheduler卡塔尔将下叁个伸手再次来到给引擎(Engine卡塔尔(قطر‎;
  • 4.引擎(Engine卡塔尔国将须求发送给下载器(Downloader卡塔尔(英语:State of Qatar),通过下载器(Downloader卡塔尔(英语:State of Qatar)中间件(请参阅processrequest(卡塔尔国卡塔尔国;
  • 5.万意气风发页面达成下载后,下载器(Downloader卡塔尔(قطر‎会变卦八个响应(使用该页面卡塔尔国并将其经过Downloader中间件发送到引擎;
  • 6.引擎(Engine卡塔尔选用来自下载器(Downloader卡塔尔(قطر‎的响应,并将其发送给spiders进行拍卖,通过spiders中间件;
  • 7.spiders管理响应并再次回到提取的items 和新乞请重回到引擎,通过爬行器spider中间件;
  • 8.引擎(Engine卡塔尔国将处理过的品类发送到项目管道(Item Pipelines卡塔尔(قطر‎,然后将拍卖过的央浼发送到调解程序(Scheduler卡塔尔(英语:State of Qatar),并号令下叁个也许要爬取的央浼;
  • 9.以此历程重复(从步骤1卡塔尔(英语:State of Qatar)直到不再有来源调治程序(Scheduler卡塔尔(قطر‎的央浼。

4. 碰着的标题计算

  1. twisted版本不见容,安装过新的本子招致,安装Twisted (13.1.0卡塔尔(英语:State of Qatar)就可以

2. 国语数据不能够写入,提醒'ascii'错误,通过设置python的encoding为utf就可以,如下:

>>> import sys
>>> sys.getdefaultencoding()
'ascii'
>>> reload(sys)
<module 'sys' (built-in)>
>>> sys.setdefaultencoding('utf8')
>>> sys.getdefaultencoding()
'utf8'

 3. 爬虫无法拿到站点数据,由于headers以致,载settings.py文件中增多USE逍客_AGENT变量,如:

USER_AGENT="Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0"

 Scrapy使用进程中大概会蒙受结果进行倒闭只怕结果施行不相符预期,其切实的logs特别详细,通过观看日志内容,并整合代码 网络检索资料即可消除。

3.2 scrapy各组件作用

Scrapy引擎(Engine)
内燃机担当调控类别的具有组件之间的数据流,当有些动作发生时接触事件
调解程序(Scheduler卡塔尔国
调整程序接纳来自引擎的呼吁,并在内燃机要求时对它们进行排队,以便在稍后(也对汽油发动机卡塔尔(قطر‎央求时提供它们
下载器(Downloader)
下载器担当获取web页面,并将它们提供给引擎,而引擎又将它们提须要spiders
Spiders
Spiders是类,它定义了二个一定的站点(或蓬蓬勃勃组站点卡塔尔(قطر‎如何被抓取,包罗如何实行爬取(也正是追踪链接卡塔尔以至如何从它们的页面中领到结构化数据(比方抓取项目卡塔尔(قطر‎。换句话说,Spiders是概念为特定站点爬行和剖判页面包车型大巴定制行为(只怕,在少数情状下,是生机勃勃组站点卡塔尔(قطر‎的定制行为。
Item Pipeline
Item Pipeline担当管理由spiders提抽出来的item,规范的拍卖有清理、 验证及长久化(举个例子存取到数据库中卡塔尔。
下载器中间件(Downloader middlewares卡塔尔
Downloader中间件是风姿浪漫种特定的钩子,它放在引擎和Downloader之间,当呼吁从蒸蒸气机传递到Downloader时,以至从Downloader传递到引擎的响应。
Spider middlewares
Spider middlewares是坐落引擎和spiders之间的一定钩子,能够管理spiders输入(响应卡塔尔国和出口(items和requests卡塔尔国。
事件驱动互连网
scrapy是用Twisted编写的,它是黄金年代种流行的、用于Python的事件驱动的网络框架。因而,它是接受非拥塞(又称为异步卡塔尔国的并发性来兑现的。

scrapy入门,那意气风发篇就得了了,迎接商议指正~!

本文由pc28.am发布于计算机编程,转载请注明出处:爬虫学习笔记,运营学python之爬虫高档篇

上一篇:hibernate程序运维现多出四个记下,06SMTP发送电子 下一篇:没有了
猜你喜欢
热门排行
精彩图文
  • 那些年【深入.NET平台和C#编程】
    那些年【深入.NET平台和C#编程】
    一、深入.NET框架 ArrayList (非泛型集合  using System.Collections;) public void Text1(){ ArrayList al = new ArrayList (); al.Add ("刘德化");       //添加元素 al.Add ("张学友
  • 碰着搭建
    碰着搭建
    Appium是移动端的自动化测试工具,类似于前面所说的Selenium,利用它可以驱动Android、iOS等设备完成自动化测试,比如模拟点击、滑动、输入等操作,其官方
  • Django中的CBV和FBV示例介绍
    Django中的CBV和FBV示例介绍
    Django中的CBV和FBV Django中的CBV和FBV示例介绍,djangocbvfbv示例 前言 本文主要给大家介绍了关于Django中CBV和FBV的相关内容,分享出来供大家参考学习,下面话不
  • 将Log4net的配置配置到的独立文件中,Log4Net日志插
    将Log4net的配置配置到的独立文件中,Log4Net日志插
  • Python面向对象编程思想
    Python面向对象编程思想
    Python中的类(一) 1.面向过程编程:计算机通过一系列指令来一步一步完成任务。 面向对象编程——Object OrientedProgramming,简称OOP,是一种程序设计思想。