设为首页 加入收藏

TOP

【学习笔记】PYTHON网络爬虫与信息提取(北理工 嵩天)(七)
2019-09-06 00:28:43 】 浏览:136
Tags:学习 笔记 PYTHON 网络 爬虫 信息 提取 理工 嵩天
爬虫scrapy crawl <spider>
list 列出工程中所有爬虫scrapy list
shell 启动URL调试命令行scrapy shell [url]

5.2 Scrapy爬虫基本使用

demo.py


import scrapy
class DemoSpider(scrapy.Spider):
    name = "demo"
    #allowed_domains = ["python123.io"]
    start_urls = ['https://python123.io/ws/demo.html']
    def parse(self, response):
        fname = response.url.split('/')[-1]
        with open(fname, 'wb') as f:
            f.write(response.body)
        self.log('Saved file %s.' % name)

步骤1:建立一个Scrapy爬虫工程 scrapy startproject python123demoimage

步骤2:在工程中产生一个Scrapy爬虫
进入demo目录中运行 scrapy genspider dem python123.io

该命令作用:
(1) 生成一个名称为demo的spider
(2) 在spiders目录下增加代码文件demo.py
该命令仅用于生成demo.py,该文件也可以手工生成

步骤3:配置产生的spider爬虫
配置:(1)初始URL地址(2)获取页面后的解析方式

步骤4:运行爬虫,获取网页
在命令行下,执行如下命令:scrapy crawl demo
demo爬虫被执行,捕获页面存储在demo.htmlimage

yield 生成器

包含yield语句的函数是一个生成器
生成器每次产生一个值(yield语句),函数被冻结,被唤醒后再产生一个值
生成器是一个不断产生值的函数
生成器每调用一次在yield位置产生一个值,直到函数执行结束imageimage

Scrapy爬虫的数据类型:

Request类  class scrapy.http.Request() Request对象表示一个HTTP请求 由Spider生成,由Downloader执行
.url Request对应的请求URL地址
.method 对应的请求方法,’GET’ ‘POST’等
.headers 字典类型风格的请求头
.body 请求内容主体,字符串类型
.meta 用户添加的扩展信息,在Scrapy内部模块间传递信息使用
.copy() 复制该请求

Response类 class scrapy.http.Response()  Response对象表示一个HTTP响应 由Downloader生成,由Spider处理
.url Response对应的URL地址
.status HTTP状态码,默认是200
.headers Response对应的头部信息
.body Response对应的内容信息,字符串类型
.flags 一组标记
.request 产生Response类型对应的Request对象
.copy() 复制该响应

Item类class scrapy.item.Item()

Item对象表示一个从HTML页面中提取的信息内容
由Spider生成,由Item Pipeline处理
Item类似字典类型,可以按照字典类型操作

Scrapy爬虫支持多种HTML信息提取方法:
? Beautiful Soup
? lxml
? re
? XPath Selector
? CSS Selector

5.3 股票数据爬虫scrapy实例

scrapy startproject BaiduStocks

scrapy genspider stocks baidu.com

stocks.py文件源代码

# -*- coding: utf-8 -*-
import scrapy
import re
 
 
class StocksSpider(scrapy.Spider):
    name = "stocks"
    start_urls = ['https://quote.eastmoney.com/stocklist.html']
 
    def parse(self, response):
        for href in response.css('a::attr(href)').extract():
            try:
                stock = re.findall(r"[s][hz]\d{6}", href)[0]
                url = 'https://gupiao.baidu.com/stock/' + stock + '.html'
                yield scrapy.Request(url, callback=self.parse_stock)
            except:
                continue
 
    def parse_stock(self, response):
        infoDict = {}
        stockInfo = response.css('.stock-bets')
        name = stockInfo.css('.bets-name').extract()[0]
        keyList = stockInfo.css('dt').extract()
        valueList = stockInfo.css('dd').extract()
        for i in range(len(keyList)):
            key = re.findall(r'>.*', keyList[i])[0][1:-5]
            try:
                val = re.findall(r'\d+\.?.*', valueList[i])[0][0:-5]
            except:
                val = '--'
            infoDict[key]=val
 
        infoDict.update(
            {'股票名称': re.findall('\s.*\(',name)[0].split()[0] + \
             re.findall('\>.*\<', name)[0][1:-1]})
        yield infoDict




下面是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
 
 
class BaidustocksPipeline(object):
    def process_item(self, item, spider):
        return item
 
class BaidustocksInfoPipeline(object):
    def open_spider(self, spider):
        self.f = open('BaiduStockInfo.txt', 'w')
 
    def close_spider(self, spider):
        self.f.close()
 
    def process_item(self, item, spider):
        try:
            line = str(dict(item)) + '\n'
            self.f.write(line)
        except:
            pass
        return item

首页 上一页 4 5 6 7 下一页 尾页 7/7/7
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Python面试题之这两个参数是什么.. 下一篇Python 之初识函数 (day08 课堂..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目