朋友託我幫忙寫個爬蟲,記錄一下。node
項目總體介紹:python
scrapy 框架 , anaconda(python 3.6)json
開發工具:框架
IDEAdom
詳細介紹:scrapy
scrapy 結構圖:ide
Scrapy主要包括瞭如下組件:工具
1.新建項目(scrapy startproject xxx ):新建一個新的爬蟲項目開發工具
2.明確目標(編寫item.py):明確你想抓去的目標網站
scrapy genspider 爬蟲名稱 域名 --在spider包下面建立爬蟲(Spiders)文件
scrapy crawl 爬蟲名稱 --啓動項目
3.製做爬蟲:(spiders/xxxspider.py):製做爬蟲開始爬取網頁
4.存儲內容:(piplines.py):設計管道存儲爬取內容
默認有四種,-o 輸出到指定格式
#json 格式,默認是Unicode
scrapy crawl itcast -o teachers.json
#lines格式,默認是Unicode
scrapy crawl itcast -o teachers.jsonl
#csv逗號表達式式,可用Excel打開
scrapy crawl itcast -o teachers.scv
#xml
scrapy crawl itcast -o teachers.xml
下面是我給朋友寫的爬蟲例子:
1.首先先說下需求吧。紅色框裏面是咱們須要的信息。目標網站是
https://www.dankegongyu.com/room/tj
咱們爬全部的詳情信息。
2.首先咱們先寫items
class ItcastItem(scrapy.Item): #名稱 name=scrapy.Field() #地理位置 discount=scrapy.Field() #標題 title=scrapy.Field() #價格 price=scrapy.Field() #詳情 list_box=scrapy.Field()
而後咱們再寫spiders
class ItcastSpider(scrapy.Spider): #爬蟲名 name = "itcast" #容許爬的域名,做用與攔截器同樣 allowed_domains = ['https://www.dankegongyu.com/room'] #起始爬蟲的url start_urls = ['https://www.dankegongyu.com/room/tj?page=1'] #流程是爬起始頁,而後獲取詳情頁的URL,爬詳情頁輸出,爬完起始頁的信息後,判斷是否有下一頁,繼續爬下一頁 直到全部頁面 def parse(self, response): node_list=response.xpath("//div[@class='r_lbx']") for node in node_list: url=node.xpath("./a/@href").extract()[0] #爬取詳情頁 #這個方法是回調,dont_filter=True 會爬取重複的頁面 #yield 做用與return同樣,可是不一樣的是返回來的時候會從這開始運行 yield scrapy.Request(url,callback=self.parse_detail1,dont_filter=True) #分頁爬取 #1.獲取下一頁的url now_url=response.xpath("//div[@class='page']/a[@class='on']/text()").extract() next_url=int(now_url[0])+1 print('next_url=',next_url) #2.若是存在下一頁,就繼續發送請求 if response.xpath("//div[@class='page']/a[@href='https://www.dankegongyu.com/room/tj?page="+str(next_url)+"']"): url2='https://www.dankegongyu.com/room/tj?page='+str(next_url) yield scrapy.Request(url2,callback=self.parse,dont_filter=True) #詳情頁面爬取規則 def parse_detail1(self,response): item=ItcastItem() name=response.xpath("//div[@class='room-detail-right']/div[@class='room-name']/h1/text()").extract() discount=response.xpath("//div[@class='room-detail-right']/div[@class='room-name']/em/text()").extract() title=response.xpath("//div[@class='room-detail-right']/div[@class='room-title']/span/text()").extract() price=response.xpath("//div[@class='room-detail-right']//div[@class='room-price-sale']/text()").extract() list_box=response.xpath("//div[@class='room-detail-right']/div[@class='room-list-box']//label/text()").extract() #處理結果,並塞入item對象 item['name']=name[0] item['discount']=discount[0] item['title']=','.join(title) item['price']=price[0].strip() item['list_box']=','.join(list_box).replace(' ','').replace('\n','').replace(',,,,,',',') yield item
這個爬蟲不須要寫中間件,因此咱們的爬蟲就算寫好了,很簡單可是寫學到東西了。