1. 程式人生 > >建立scrapy 專案框架

建立scrapy 專案框架

  1. 建立專案
    scrapy startproject project_name

  2. 建立spider
    cd project_name
    scrapy genspider 模組名 網址
    scrapy genspider hangzhou www.xxxx.com

  3. 目錄結構
    ├── hangzhounews – 專案根目錄
    │ ├── init.py
    │ ├── pycache --python執行臨時檔案 pyc
    │ │ ├── init.cpython-36.pyc
    │ │ └── settings.cpython-36.pyc
    │ ├── items.py – 用來定義爬取哪些內容 (類似Django中的models)
    │ ├──

    middlewares.py --中介軟體
    │ ├── pipelines.py --管道,用來處理爬取的資料
    │ ├── settings.py --配置檔案
    │ └── spiders --自定義爬蟲包
    │ ├── init.py
    │ ├── pycache
    │ │ └── init.cpython-36.pyc
    │ └── hangzhou.py --一個爬蟲檔案
    └── scrapy.cfg – 部署時候用的配置檔案

class HangzhouSpider(scrapy.Spider):
    name = 'hangzhou'
    allowed_domains = ['hznews.hangzhou.com.cn']
    start_urls = ['http://hznews.hangzhou.com.cn/']

# 如果不重寫start_requests方法 父類的方法會自動迭代start_urls生成一個生成器,每個元素為一個scrapy.Request()物件

    def start_requests(self):
        print('1,start request')
        for url in self.start_urls:
            # 生成一個Request物件,callback為None則表示,回撥函式為parse
            print('2,生成Request物件')
            req = scrapy.Request(url,callback=None)

            # start_requests的返回值應該是一個可迭代物件。列表之類都可以,儘量使用yield關鍵字構造生成器
            print('3,生成器')
            yield req


    def parse(self, response):
        print('4,解析')
        print(response)

        # 型別為<class 'scrapy.selector.unified.SelectorList'>
        all_news = response.xpath('//td[@class="hzwNews_L_link"]/a')

        item = {}
        for news in all_news:
            # news 型別為Selector
            headline = news.xpath('.//text()').extract_first()
            href = news.xpath('.//@href').extract_first()
            item['headline'] = headline
            item['href'] = href
			print(item)
            yield item

注:

    SelectorList物件:可以看做Selector的列表集合。可迭代
    關鍵方法 extract()=getall()。extract_first() = get()
    extract()取出SelectorList中的Selector依次執行.get()方法。將結果放在列表中返回。
        def getall(self):
            return [x.get() for x in self]
        extract = getall()
        
    extract_first()取出SelectorList中的第一個Selector,返回Selector.get()。即返回第一個Selector的文字資訊
        def get(self, default=None):
            for x in self:
                return x.get()
            else:
                return default
        extract_first = get
        
    Selector:
    關鍵方法
    get() = extract() 。getall() 
    extract()將Selector中的文字提取出來。返回值為str。
    getall() 將Selector中的文字提取出來。放在列表中。列表中只有一個元素

終端執行:scrapy crawl hangzhou --nolog
結果
1,start request
2,生成Request物件
3,生成器
4,解析
<200 http://hznews.hangzhou.com.cn/>
{‘headline’: ‘杭州構建"一心八射"交通網 1小時通勤圈來了’, ‘href’: ‘http://hznews.hangzhou.com.cn/chengshi/content/2018-10/29/content_7088441.htm’}
{‘headline’: ‘文一路隧道形成8個大小堵點 如何緩解?’, ‘href’: ‘http://hznews.hangzhou.com.cn/chengshi/content/2018-10/29/content_7088393.htm’}
{‘headline’: ‘杭州開啟陽光常駐模式 早晚溫差有點大’, ‘href’: ‘http://hznews.hangzhou.com.cn/chengshi/content/2018-10/29/content_7088317.htm’}
{‘headline’: ‘杭州發出國際級軟體名城建立政策“大禮包”’, ‘href’: ‘http://hznews.hangzhou.com.cn/jingji/content/2018-10/29/content_7088345.htm’}
{‘headline’: ‘東站"乞討奶奶"家有五層樓 存款超10萬’, ‘href’: 。。。