Scrapy基础学习

作者: admin 分类: Python 发布时间: 2017-08-08 16:07

做了个支线任务scrapy学习。

安装

pip3 install scrapy
scrapy startproject yourproject
切换到spiders目录下面
scrapy genspider jobbole blog.jobbole.com

scrapy运行

创建一个main.py,更加方便的运行scrapy

#coding:utf-8
#author:2amor

from scrapy.cmdline import execute
import sys
import os

sys.path.append(os.path.dirname(os.path.abspath(__file__)))
execute(["scrapy","crawl","jobbloe"])

xpath语法

article        选取所有article元素的所有子节点
/article       选取跟元素article
/article/a    选取所有属于article的子元素的a元素
//div          选取所有div子元素(不论出现在文档任何地方)
article//div  选取所有属于article元素的后代的DIV元素,不管它出现在article之下的任何位置
//@class      选取所有名为class属性

//article/div[1]         选取属于article子元素的第一个div元素
/article/div[last()]     选取属于article子元素的最后一div元素
/article/div[last()-1]  选取属于article子元素的倒数第二个div元素
//div[@lang]            选取所有拥有lang属性的div元素
//div[@lang='eng']      选取所有lang属性为eng的div元素
//div/*                     选取属于div元素的所有子节点
//*                          选取所有元素
//div[@*]                 选取所有带属性的title元素
//div/a | //div/p        选取所有div元素的a和p元素
//span | //ul             选取文档中的span和ul元素
article/div/p | //span  选取所有属于article元素的div元素的p元素以及文档中所有的span元素

xpath使用的例子:

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


class JobboleSpider(scrapy.Spider):
    name = 'jobbole'
    allowed_domains = ['blog.jobbole.com']
    start_urls = ['http://blog.jobbole.com/110287']

    def parse(self, response):
        title = response.xpath('//div[@class="entry-header"]/h1/text()').extract()[0]
        create_time = response.xpath('//p[@class="entry-meta-hide-on-mobile"]/text()').extract()[0]
        praise_nums = response.xpath("//span[contains(@class,'vote-post-up')]/h10/text()").extract()[0]
        fav_nums = response.xpath("//span[contains(@class,'bookmark-btn')]/text()").extract()[0]
        match_re = re.match(".*?(\d+).*", fav_nums)
        if match_re:
            fav_nums = match_re.group(1)
        comment_nums = response.xpath("//a[@href='#article-comment']/span/text()").extract()[0]
        match2_re = re.match(".*?(\d+).*", comment_nums)
        if match2_re:
            comment_nums = match_re.group(1)


        content = response.xpath("//div[@class='entry']").extract()
        tag_list = response.xpath("//p[@class='entry-meta-hide-on-mobile']/a/text()").extract()
        tag_list = [element for element in tag_list if not element.strip().endswith("评论")]

        tags = ",".join(tag_list)

        pass

css选择器语法

*                 选择所有节点
#container     选择id为container的节点
.container      选取所有class包含container的节点
li a               选取所有li下的所有a节点
ul + p           选取ul后面的第一个P元素
div#container > ul   选取id为container的div的第一个ul子元素

ul ~ p       选取与ul相邻的所有P元素
a[title]     选取所有有title属性的a元素
a[href="http://jobbole.com"]   选取所有href属性为jobbole的a元素
a[href^="http"]         选取所有href属性值以http开头的a元素
a[href$=".jpg"]           选取所有href属性值以.jpg结尾的a元素
input[type=radio]:checked  选择选中的radio的元素
div:not(#container)      选取所有id非container的div属性
li:nth-child(3)            选取第三个li元素
tr:nth-child(2n)          第偶数个tr

css选择器使用的例子:

        #使用css提取值
        title = response.css(".entry-header h1::text").extract()
        create_date = response.css(".entry-meta-hide-on-mobile::text").extract()[0].strip()
        praise_nums = response.css(".vote-post-up h10::text").extract()[0]
        fav_nums = response.css(".bookmark-btn::text").extract()[0]
        match_re = re.match(".*?(\d+).*", fav_nums)
        if match_re:
            fav_nums = match_re.group(1)
        comment_nums = response.css("a[href='#article-comment'] span::text").extract()[0]
        match2_re = re.match(".*?(\d+).*", comment_nums)
        if match2_re:
            comment_nums = match_re.group(1)
        content = response.css("div.entry").extract()[0]
        tag_list = response.css("p.entry-meta-hide-on-mobile a::text").extract()
        tag_list = [element for element in tag_list if not element.strip().endswith("评论")]
        tags = ",".join(tag_list)

在Shell中尝试Selector选择器

方便本地分析

scrapy shell http://blog.jobbole.com/110287

参考文献:

http://scrapy-chs.readthedocs.io/zh_CN/0.24/intro/tutorial.html

发表评论

电子邮件地址不会被公开。 必填项已用*标注

标签云