初始scrapy,简单项目创建和CSS选择器,xpath选择器(1)

一 安装

  #Linux:

      pip3 install scrapy

  #Windows:

      a. pip3 install wheel

      b. 下载twisted http://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted

      c. 进入下载目录,执行 pip3 install Twisted?17.1.0?cp35?cp35m?win_amd64.whl

      d. pip3 install pywin32

      e. pip3 install scrapy

二 实验要求

目标网站: http://quotes.toscrape.com/tag/humor/

任务:保存网页信息到本地

二 创建爬虫项目

scrapy startproject tutorial

生成项目的结构

tutorial/
    scrapy.cfg            # 部署配置文件

    tutorial/             # 项目的Python模块,你将从这里导入你的代码
        __init__.py

        items.py          # 项目项目定义文件,用于规定存储的字段

        middlewares.py    # 项目中间件文件

        pipelines.py      # 项目持久化存储文件

        settings.py       # 项目配置文件

        spiders/          # 这里可以创建爬虫文件

       .        # 若干个爬虫文件        .       .
            __init__.py

三 创建爬虫文件

scrapy genspider QuotesSpider #爬虫文件名为QuotesSpider 

使用pycharm打开项目,修改QuotesSpider .py 文件改为

# -*- coding: utf-8 -*-
import scrapy

class QuotesspiderSpider(scrapy.Spider):
    name = ‘QuotesSpider‘ #爬虫名字

    def start_requests(self):
        #待爬取的url列表
        urls = [
            ‘http://quotes.toscrape.com/page/1/‘,
            ‘http://quotes.toscrape.com/page/2/‘,
        ]
        for url in urls:
            #提交请求,并制定回调函数为self.parse
            yield scrapy.Request(url=url, callback=self.parse)

    def parse(self, response):
       ‘解析页面,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)
    

其中

  name: 爬虫名字,项目中名字是唯一的.

  start_requests():必须返回一个可迭代的对象.爬取起始url网页.指定回调函数.

  parse():解析页面数据,

四 启动爬虫文件

scrapy crawl QuotesSpider

效果展示

五 项目执行流程

  Scrapy 执行的时候,首先会调用start_requests方法,然后执行方法中的scrapy.Request方法获取url对应网站的数据,得到Response相应对象,转而把Response对象交给Scrapy.Request的回调函数,在回调函数中解析response对象中的网页源码数据,保存到当前目录下.

六  Scrapy shell

  使用Scrapy提取数据的最佳方法时使用scrapy shell 常识选择器.

scrapy shell "http://quotes.toscrape.com/page/1/"

执行此命令后可以进入交互模式(如下):

解析可选参数

[s] Available Scrapy objects:

[s]   scrapy     # 可以使用scrapy中的模块,如contains scrapy.Request, scrapy.Selector...
[s]   crawler    # 当前爬虫对象
[s]   item       {}
[s]   request    #当前的请求页面
[s]   response   #当前请求的响应
[s]   settings   # 当前的配置文件
[s]   spider     <DefaultSpider ‘default‘ at 0x7fa91c8af990>

[s] Useful shortcuts:
[s]   shelp()           Shell help (print this help)
[s]   fetch(req_or_url) # 爬取url或者request获取新的response
[s]   view(response)    # 使用网页打开response

使用栗子:

>>> response.css(‘title::text‘).getall() #获取标题中提取文本
[‘Quotes to Scrape‘]

七 scrapy 中的数据解析

  Scrapy带有自己的提取数据机制。它们被称为选择器,因为它们“选择”由XPathCSS表达式指定的HTML文档的某些部分。

测试代码

‘‘‘

<html>
 <head>
  <base href=‘http://example.com/‘ />
  <title>Example website</title>
 </head>
 <body>
  <div id=‘images‘>
   <a href=‘image1.html‘>Name: My image 1 <br /><img src=‘image1_thumb.jpg‘ /></a>
   <a href=‘image2.html‘>Name: My image 2 <br /><img src=‘image2_thumb.jpg‘ /></a>
   <a href=‘image3.html‘>Name: My image 3 <br /><img src=‘image3_thumb.jpg‘ /></a>
   <a href=‘image4.html‘>Name: My image 4 <br /><img src=‘image4_thumb.jpg‘ /></a>
   <a href=‘image5.html‘>Name: My image 5 <br /><img src=‘image5_thumb.jpg‘ /></a>
  </div>
 </body>
</html>

‘‘‘

1 css解析器

>>> response.css(‘title‘).getall() #获取所有的匹配结果
[‘<title>Quotes to Scrape</title>‘]
>>> response.css(‘title::text‘)[0].get() #获取第一个匹配结果
‘Quotes to Scrape‘

使用正则匹配结果

>>> response.css(‘title::text‘).re(r‘Quotes.*‘)
[‘Quotes to Scrape‘]

>>> response.css(‘title::text‘).re(r‘Q\w+‘)
[‘Quotes‘]

>>> response.css(‘title::text‘).re(r‘(\w+) to (\w+)‘)
[‘Quotes‘, ‘Scrape‘]

2 xpath 解析数据

>>> response.xpath(‘//title‘)
[<Selector xpath=‘//title‘ data=‘<title>Quotes to Scrape</title>‘>]
>>> response.xpath(‘//title/text()‘).get()
‘Quotes to Scrape‘

  注意:scrapy使用xpath解析出来的数据返回的是select对象,一般提取数据信息的方法如下

# 获取第一个元素
author = div.xpath(‘./div[1]/a[2]/h2/text()‘)[0].extract()
# 获取第一个元素
author = div.xpath(‘./div[1]/a[2]/h2/text()‘).extract_first()

#获取所有元素,结果为一个列表
content = div.xpath(‘./a[1]/div/span//text()‘).extract()

现在我们将获得基本URL和一些图像链接:

>>> response.xpath(‘//base/@href‘).get()
‘http://example.com/‘

>>> response.css(‘base::attr(href)‘).get()
‘http://example.com/‘

>>> response.css(‘base‘).attrib[‘href‘]
‘http://example.com/‘

>>> response.xpath(‘//a[contains(@href, "image")]/@href‘).getall()
[‘image1.html‘,
 ‘image2.html‘,
 ‘image3.html‘,
 ‘image4.html‘,
 ‘image5.html‘]

>>> response.css(‘a[href*=image]::attr(href)‘).getall()
[‘image1.html‘,
 ‘image2.html‘,
 ‘image3.html‘,
 ‘image4.html‘,
 ‘image5.html‘]

>>> response.xpath(‘//a[contains(@href, "image")]/img/@src‘).getall()
[‘image1_thumb.jpg‘,
 ‘image2_thumb.jpg‘,
 ‘image3_thumb.jpg‘,
 ‘image4_thumb.jpg‘,
 ‘image5_thumb.jpg‘]

>>> response.css(‘a[href*=image] img::attr(src)‘).getall()
[‘image1_thumb.jpg‘,
 ‘image2_thumb.jpg‘,
 ‘image3_thumb.jpg‘,
 ‘image4_thumb.jpg‘,
 ‘image5_thumb.jpg‘]

最后归纳:

获取元素中的文本推荐使用

  • get( ) #获取第一个值
  • getall( ) #获取所有,返回列表

八 调整代码进行所有页面数据爬取

# -*- coding: utf-8 -*-
import scrapy

class QuotesspiderSpider(scrapy.Spider):
    name = ‘QuotesSpider‘

    start_urls = [
        ‘http://quotes.toscrape.com/page/1/‘,
    ]

    def parse(self, response):
        for quote in response.css(‘div.quote‘):
            yield {
                ‘text‘: quote.css(‘span.text::text‘).get(),
                ‘author‘: quote.css(‘small.author::text‘).get(),
                ‘tags‘: quote.css(‘div.tags a.tag::text‘).getall(),
            }
        #获取下一页的url
        next_page = response.css(‘li.next a::attr(href)‘).get()
        if next_page is not None:
            #urljoin用于构建下一页的绝对路径url
            next_page = response.urljoin(next_page)
            yield scrapy.Request(next_page, callback=self.parse)

  使用css选择器获取下一页的url(相对路径),在使用response.urljoin()获取绝对路径,再次回调self.parse()实现所有页面数据爬取.

九 scrapy 文件输出参数

scrapy crawl quotes -o quotes-humor.json ‘‘‘  - o  把详情页返回结果,输入到文件‘‘‘

原文地址:https://www.cnblogs.com/angle6-liu/p/10725011.html

时间: 2024-10-10 15:59:19

初始scrapy,简单项目创建和CSS选择器,xpath选择器(1)的相关文章

王立平--java se的简单项目创建以及详解

创建项目的简单步骤: /* public static void main(String[] args) public:权限修饰符,权限最大. static:随着MianDemo类的加载而加载,消失而消失. void:  没有返回值 main: 函数名,jvm识别的特殊函数名 (String[] args):定义了一个字符串数组参数 */ package com.main; public class Main { public static void main(String[] args) {

cube.js 学习(一)简单项目创建

cube.js 是一个很不错的模块化分析框架,基于schema生成sql 同时内置可代码生成,可以快速的搞定 web 分析应用的开发 安装cli 工具 npm install -g cubejs-cli 创建简单应用 使用cli cubejs create pg-demo -d postgres 准备pg 数据库 使用docker-compose version: "3" services: postgres: image: postgres:9.6.11 ports: - "

今天做项目用了CSS伪类选择器“before”,就来了解了解它怎么使用,又如何用?

我不知道有没有小伙伴以前跟我一样,在一个元素内部想要添加一个小图标或者小东西的时候, 直接在HTML文档里自己加上<span>标签,或者其他的.亦或者用javascript在该元素中追加一个元素. 比如我们向下面这些div中添加b元素: <div></div> <div></div> <div></div> <div></div> $(function){ $("div").ap

Windows 8.1 应用再出发 (WinJS) - 创建一个简单项目

原文:Windows 8.1 应用再出发 (WinJS) - 创建一个简单项目 前面几篇我们介绍了如何利用 C# + XAML 完成Windows Store App 功能的实现,接下来的几篇我们来看看如何利用 Html + WinJS 来完成这些功能. 本篇我们使用WinJS 来创建一个简单的项目,来看看项目的构成是怎样的,与C#,XAML 的项目有哪些异同. 首先我们在Visual Studio 2013中选择模板 -> JavaScript -> Windows 应用商店来创建一个空白应

m2eclipse简单使用,创建Maven项目 ,运行mvn命令(转)

前面介绍了如何安装m2eclipse,现在,我们使用m2ecilpse导入Hello World项目. 选择菜单项File,然后选择Import,我们会看到一个Import对话框,在该对话框中选择General目录下的Maven Projects,然后点击Next,就会出现Import Projects对话框, 在该对话框中点击Browse…选择Hello World的根目录(即包含pom.xml文件的那个目录),这时对话框中的Projects:部分就会显示该目录包含的Maven项目. 点击Fi

Python中Scrapy框架元素选择器XPath的简单实例

原文标题:<Python网络爬虫-Scrapy的选择器Xpath> 对原文有所修改和演绎 优势 XPath相较于CSS选择器,可以更方便的选取 没有id class name属性的标签 属性或文本特征不显著的标签 嵌套层次极其复杂的标签 XPath路径 定位方式 / 绝对路径 表示从根节点开始选取 // 相对路径 表示从任意节点开始 基本的节点定位 #查找html下的body下的form下的所有input节点 /html/body/form/input #查找所有input节点 //input

scrapy初始和简单应用

什么是Scrapy Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架,非常出名,非常强悍.所谓的框架就是一个已经被集成了各种功能(高性能异步下载,队列,分布式,解析,持久化等)的具有很强通用性的项目模板.对于框架的学习,重点是要学习其框架的特性.各个功能的用法即可. 安装 1.Linux: pip3 install scrapy 2.Windows: a. pip3 install wheel b. 下载twisted http://www.lfd.uci.edu/~gohlk

jQuery的简单用法(jQuery的简介,选择器,属性和css,文档处理)

一.jQuery简介 1.1.  JS库 JavaScript 库封装了很多预定义的对象和实用函数.能帮助使用者建立有高难度交互客户端页面, 并且兼容各大浏览器. 1.2.  当前流行的 JavaScript 库有: ① jQuery ,最流行 ② EXT JS,2.0开始收费 ③ Prototype,对js扩展,框架开发. ④ Dojo ⑤ Bootstrap,来自 Twitter,是目前很受欢迎的前端框架.Bootstrap 是基于 HTML.CSS.JAVASCRIPT 的,它简洁灵活,使

CSS 定位和选择器

CSS 定位 CSS 定位 (Positioning) 属性允许你对元素进行定位. CSS 为定位和浮动提供了一些属性,利用这些属性,可以建立列式布局,将布局的一部分与另一部分重叠,还可以完成多年来通常需要使用多个表格才能完成的任务. 一切皆为框 div.h1 或 p 元素常常被称为块级元素.这意味着这些元素显示为一块内容,即“块框”.与之相反,span 和 strong 等元素称为“行内元素”,这是因为它们的内容显示在行中,即“行内框”. 使用 display 属性改变生成的框的类型.这意味着