博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
zg手册 之 scrapy 开发(2)-- 页面抓取
阅读量:6687 次
发布时间:2019-06-25

本文共 3635 字,大约阅读时间需要 12 分钟。

  hot3.png

开始第一个抓取程序,抓取豆瓣读书的一些电子书籍信息

  1. 安装 scrapy 爬虫框架,pip install scrapy

  2. 创建项目,在项目目录执行命令 scrapy startproject douban 生成下面的目录和文件

    1. scrapy.cfg: 项目配置文件

    2. douban/: 项目的 python 源代码 module

    3. douban/items.py: 定义 item 类,用来存储爬取的数据.

    4. douban/pipelines.py: pipelines文件,定义清洗,处理数据的类

    5. douban/settings.py: 项目的配置文件

    6. douban/spiders/: 放置你开发的蜘蛛(可以定义多个蜘蛛)

首先定义 items

item 就是存储爬取到数据的类,它的使用方式与字典相似。 定义的 item 继承自 scrapy.item.Item, 使用scrapy.item.Field 定义保存抓取数据的字段

修改 items.py 文件,定义抓取的三个字段

from scrapy.item import Item, Field class DoubanBookItem(Item):     title = Field()     author = Field()     publisher = Field()     category = Field()     price = Field()

定义 spider

在spiders目录下创建 spider 文件 doubanbook_spider.py, spider 的工作是提供抓取的 url 列表,解析返回的响应页面,从中提取数据 items, spider 需要继承自 scrapy.spider.Spider

scrapy.spider.Spider 包含下面的方法和属性:

  1. name: 指定 spider 的名字,必须是唯一的,不同的 spider 使用不同的名字(这个名字定义后在 scrapy命令行可以查看,并在运行时选择执行 spider

  2. start_urls: 这个属性定义了开始抓取的 url 列表,这个列表中的页面被下载后,从下载的页面中提取新的 url 请求

  3. parse() 提供回调方法,解析抓取到的响应页面,提取数据并创建 items,或者生成更多的 request(url) 供下一步抓取

import bs4 from scrapy.selector import Selector from scrapy.spider import Spider class DoubanBookSpider(Spider):     name = "doubanBook"     allowed_domains = ["douban.com"]     start_urls = [         "http://book.douban.com", # 第一页面     ]     def parse(self, response):         """通过 xpath 获取热门电子书的链接"""         sel = Selector(response)         sites = sel.xpath('//div[@class="section ebook-area"]//ul[@class="list-col list-col5"]/li//div[@class="title"]')         for site in sites:             title = site.xpath('a/@title').extract()             link = site.xpath('a/@href').extract()             title, link = title[0], link[0]             print title, link             yield Request(url=link, callback=self.parse2)     def parse2(self, response):         """         解析电子书详细信息页面,使用 dom 解析获取数据         """         soup = bs4.BeautifulSoup(response.body)         bookInfo = soup.findAll('div', attrs={'class':'article-profile-bd'})         if bookInfo:             bookInfo = bookInfo[0]             item = DoubanBookItem()             item['title'] = "".join(bookInfo.findAll('h1', attrs={'class':'article-title'})[0].strings)             item['author'] = "".join(bookInfo.findAll('p', attrs={'class':'author'})[0].strings)             item['category'] = "".join(bookInfo.findAll('p', attrs={'class':'category'})[0].strings)             item['price'] = bookInfo.findAll('div', attrs={'class':'article-actions purchase-none purchase-layout-horizontal'})[0]['data-readable-price']             # debug             print item['title'].encode('utf-8')             print item['author'].encode('utf-8')             return item

运行爬虫

  1. 运行 scrapy list 查看当前有的蜘蛛

  2. 运行 scrapy crawl -t json -o result.json doubanBook 输出爬取的结果到 json 格式的结果文件

数据处理和存储

上面执行爬虫使用的是 scrapy 自身的数据导出方式(通过命令行参数 -t 指定),如果需要自定义导出方式,例如存储数据到 redis 队列可以如下操作

  1. 修改 pipelines.py 文件,添加如下代码

import redisimport json

class DoubanPipeline(object):    def __init__(self):        self.file = open('items.jl', 'wb')    def process_item(self, item, spider):        if int(item['price']) > 2:            # to redis            rd = redis.Redis(host='xxx', port=35000, db=0)            rd.lpush('result', json.dumps(dict(item)))            # to file            line = json.dumps(dict(item)) + "\n"            self.file.write(line)            return item        else:            raise DropItem("Price err")

在配置文件中开启pipline插件,修改 settings.py 文件

ITEM_PIPELINES = {                'douban.pipelines.DoubanPipeline': 300,                }

技术点

  1. 页面的分析主要采用 xpath/css选择器/dom解析/正则表达式 等方式处理(上面演示了2种方法)

  2. 解析函数被调用的方式是基于异步回调,不要在解析函数内调用长时间阻塞的函数,要尽快把控制权返回给引擎

相关文件链接

原文链接: 

转载于:https://my.oschina.net/hopez/blog/214237

你可能感兴趣的文章
十五、curator recipes之DistributedQueue
查看>>
java基础---多线程---JUC线程池
查看>>
leetcode总结:permutations, permutations II, next permutation, permutation sequence
查看>>
RegexKitLite 正则表达式
查看>>
暑期第一弹<搜索> E - Find The Multiple(DFS)
查看>>
maven+spring mvc+mybatis+redis+dubbo+zookeeper
查看>>
PowerShell脚本保存密码
查看>>
前端基础(JavaScript)
查看>>
redis 系列9 对象类型(字符串,哈希,列表,集合,有序集合)与数据结构关系
查看>>
在另一个类中做数据成员的对象,可以先不初始化
查看>>
最终类final
查看>>
Springboot开启事务
查看>>
广搜——三维迷宫
查看>>
安装OpenCV3.1 与VS2015配置主要步骤
查看>>
mian函数接受两个实参,&nbsp;连成s…
查看>>
mssql timeout 超时时间已到
查看>>
LVS负载均衡
查看>>
[研究笔记]n个骰子得到点数和的概率分布
查看>>
一起谈.NET技术,Sharepoint 究竟能为客户做些什么
查看>>
解决ftp登录问题:500 OOPS: cannot change directory:/home/xxx 500 OOPS: child died
查看>>