建立scrapy 專案框架
-
建立專案
scrapy startproject project_name -
建立spider
cd project_name
scrapy genspider 模組名 網址
scrapy genspider hangzhou www.xxxx.com -
目錄結構
├── hangzhounews – 專案根目錄
│ ├── init.py
│ ├── pycache --python執行臨時檔案 pyc
│ │ ├── init.cpython-36.pyc
│ │ └── settings.cpython-36.pyc
│ ├── items.py – 用來定義爬取哪些內容 (類似Django中的models)
│ ├──
│ ├── 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’: 。。。