首页 » python » 正文

Scrapy框架学习

1.前言

学习scrapy框架遇到了很多坑,安装各种少库,环境,变量,学习过程中遇到各种装逼文章,一段就可以搞定的写NM5-6行。(吐槽下)

 

2. Scrapy架构图(来源网络)

request对象由spiders对象产生,

经由Scheduler传送到Downloader,

Downloader执行request并返回response给spiders。

具体参考官方文档

3. 基本命令

scrapy startproject   xxx     创建项目名称

tree 查看目录结构

scrapy genspider  baidu “www.baidu.com”   创建爬虫程序(百度举例)

scrapy check xxx   执行爬虫名称

scrapy crawl  xxx   运行一个爬虫程序并且输才日志

scrapy crawl  xxx   --nolog   不输出日志

 

4. xpath语法

下面以div标签为例:

//div  表示查询某个标签的所有div标签
//div[@class='item_list']   表示找到所有的div下属性为class='item_list'的
//div[@class='item_list']/div  表示找到这个div的所有标签
//div[@class='item_list']//span  表示找在这个div下的所有span标签
//div[@class='item_list']//a/text()  表示找在这个div下的所有a标签并获得所有a标签的内容
//div[@class='item_list']//img/@src  表示找在这个div下的所有img标签并获得所有img标签的src属性

推荐工具

谷歌:xpath helper

firefox:WebDriver Element Locator

点我: XPath教程

 

5. 导出文件

利用scrapy内置的Feed功能,我们可以非常方便的将爬虫数据导出为XML、JSON和CSV等格式的文件。要做的只需要在运行scrapy的时候用-o参数指定导出文件名即可。

scrapy crawl xxx  -o f.json
scrapy crawl xxx  -o f.csv
scrapy crawl xxx  -o f.xml

 

6.案例(21行代码爬虫新闻网站)

创建就不写了直接上代码

目标网站(http://hope.huanqiu.com/domesticnews/2.html)

爬取:连接, 标题,时间。

items.py

设置爬取名称(可任意设置)

import scrapy

class XwItem(scrapy.Item):

    name = scrapy.Field()        //名称
    connection = scrapy.Field()   //连接
    time = scrapy.Field()         //时间

huanqiu.py    (创建写爬虫)

# -*- coding: utf-8 -*-
import scrapy
from xw.items import XwItem
from scrapy.http import Request

class HuanqiuSpider(scrapy.Spider):
    name = 'huanqiu'
    allowed_domains = ['hope.huanqiu.com']
    start_urls = ['http://hope.huanqiu.com/domesticnews/2.html']

    def parse(self, response):
        xw = response.xpath('//div[@class="pad20"]/div/ul/li')     //先爬取网站里面所有新闻
                                                                  // 新闻名称时间标题全部在 div/ul/li 目录下

        

        for hq in xw:
        	item = XwItem()
        	item['name'] = hq.xpath('./a/@title').extract()[0]             //提取你需要的信息
        	item['connection'] = hq.xpath('./a/@href').extract()[0]
        	item['time'] = hq.xpath('./em').extract()[0]

        	yield item


//for循环下一页

        for x in range(1,10):
        	url = 'http://hope.huanqiu.com/domesticnews/2' + str(x) + '.html'
        	yield Request(url, callback=self.parse)
        			

settings.py

FEED_EXPORT_ENCODING = 'utf-8'   //设置编码

ROBOTSTXT_OBEY = False   //设置不遵守robots.txt 的规则

使用方法

scrapy crawl  huanqiu -o ite.json   //保存在根目录下  ite.json 文件

 

 

发表评论

You must enable javascript to see captcha here!