分享

Python爬虫Scrapy入门篇

 Four兄 2019-09-29

前言

好久没有更新过了啊…请原谅我……

话不多说,进入正题!因为Python简单灵活的特点,一直是写爬虫的热门语言,我之前也分享过几篇简单的爬虫例子和教程了,今天来说一说爬虫框架Scrapy。
Scrapy是一款简单高效的Python网络爬虫框架,使用框架,我们就可以只关注数据的提取而不用去自己造轮子了。其实,对于这个框架,我也是个新手…这里,就用我们学校的图书馆系统做个简单的入门项目了。

安装

先说一下我的Python是3.6版本的,电脑是win10。

Scrapy也可以直接用使用pip命令安装:

pip install scrapy

因为Scrapy依赖了其他一些包,所以会额外安装一些库,如lxmlTwistedpyOpenSSL等,这在文档也有提到。我在安装这些库时有遇到一个问题,报了下面这个错误:

Command ''d:\program files\python3.6.1\python.exe' -u -c 'import setuptools, tokenize;__file__='C:\\Users\\ASUS\\AppData\\Local\\Temp\\pip-build-qkm97m8f\\Twisted\\setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, __file__, 'exec'))' install --record C:\Users\ASUS\AppData\Local\Temp\pip-e4cf8gml-record\install-record.txt --single-version-externally-managed --compile' failed with error code 1 in C:\Users\ASUS\AppData\Local\Temp\pip-build-qkm97m8f\Twisted\

可以看到是安装Twisted出的问题,解决方法是在 这里 下载对应版本的whl包,我的是Twisted-17.9.0-cp36-cp36m-win32.whlcp后面是Python版本,win32表示位数,我的Python是32位的。

然后切换到下载目录运行以下命令:

pip install Twisted-17.9.0-cp36-cp36m-win32.whl

然后再安装Scrapy就可以了。你会看到:

Successfully installed PyDispatcher-2.0.5 asn1crypto-0.24.0 cffi-1.11.4 cryptography-2.1.4 cssselect-1.0.3 parsel-1.4.0 pyOpenSSL-17.5.0 pyasn1-0.4.2 pyasn1-modules-0.2.1 pycparser-2.18 queuelib-1.4.2 scrapy-1.5.0 service-identity-17.0.0

创建项目

切换到你想放这个项目的目录,执行scrapy startproject projectname创建一个项目,如:

scrapy startproject scrapy_test

生成的项目结构是这样的:

scrapy_test/
   scrapy.cfg            # deploy configuration file
   scrapy_test/             # project's Python module, you'll import your code from here
       __init__.py
       items.py          # project items definition file
       middlewares.py    # project middlewares file
       pipelines.py      # project pipelines file
       settings.py       # project settings file
       spiders/          # a directory where you'll later put your spiders
           __init__.py

spiders目录用于放置我们的爬虫,items.py用于定义我们要获取的数据,pipelines.py定义存储,settings.py顾名思义就是配置文件了。

编写代码


第一步我们先定义要存储什么字段,这里就定义书名、作者和索引号吧,编写items.py

import scrapy
class BooksItem(scrapy.Item):
   '''定义要存储的字段'''
   # 书名
   name = scrapy.Field()
   # 作者
   author = scrapy.Field()
   # 索引号
   call_number = scrapy.Field()

接下来我们在spiders目录下编写爬虫文件,我这里新建一个books_spider.py文件,代码如下:

import scrapy
from scrapy_test.items import BooksItem
class BooksSpider(scrapy.Spider):
   '''图书爬虫类'''
   # 这个name不能重复
   name = 'books'
   # allowed_domains = ['202.116.174.108:8080']
   start_urls = ['http://202.116.174.108:8080/top/top_lend.php?cls_no=ALL']
   def parse(self, response):
       '''处理下载的response的默认方法'''
       books = []
       for item in response.xpath('//tr')[1:]:
           book = BooksItem()
           book_name = item.xpath('td[2]/a/text()').extract()
           book_author = item.xpath('td[3]/text()').extract()
           book_call_number = item.xpath('td[5]/text()').extract()
           book['name'] = book_name[0]
           book['author'] = book_author[0]
           book['call_number'] = book_call_number[0]
           books.append(book)
       return books

这个类继承scrapy.Spider,需要指定name,它是运行爬虫用的,start_urls是要爬取的url列表,parse函数接收获取到的response解析用的是scrapy自带的xpath,这个网页的结构很简单,所以就不多解释了。总之,就是遍历每一本书的信息,然后存在books中。这些信息在之前的item中已经定义了。
代码的编写到这里就结束了,接下来就可以运行了。

运行代码

要运行代码,切换到项目的目录里,执行下面的命令,其中books就是上面的namebooks.json就是生成的json文件:

scrapy crawl books -o books.json -t json

开始运行时,出现了一个问题,就是没报错,但没有结果,输出一片空白,然后发现下面的提示:

DEBUG: Forbidden by robots.txt

这是因为要获取的页面在robots中被禁止了,所以Scrapy自动忽略了,只需修改settings.py将:ROBOTSTXT_OBEY改为False就行了。

后来又遇到了乱码的问题,输出全是\uxxx这种字符,只要在settings.py加上FEED_EXPORT_ENCODING = 'utf-8'就可以。

没报错执行完上面的命令之后就会在根目录生成一个books.json文件,打开,就会看到保存下来的json格式图书信息:

[
 {
   'name': '暗恋·橘生淮南',
   'author': '八月长安[著]',
   'call_number': 'I247.57/5494'
 },
 {
   'name': 'Time series and panel data econometrics / First edition.',
   'author': 'M. Hashem Pesaran.',
   'call_number': 'F224.0/EN4'
 },
 {
   'name': '杀死一只知更鸟.第2版',
   'author': '(美国) 哈珀·李著',
   'call_number': 'I712.45/1231=2'
 },
 ...
 ...
 {
   'name': '众筹:互联网金融的下一个风口',
   'author': '陈晓暾, 白帆, 陈英编著',
   'call_number': 'F830.45/77'
 }
]


我们的Scrapy入门项目就完成了!

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多