日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

day96 scrapy

發布時間:2023/12/20 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 day96 scrapy 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.scrapy安裝   ubuntu下安裝 

1.先安裝pipsudo apt install python3-pip2.安裝依耐sudo apt install python-dev3.安裝非Python的依賴 sudo apt-get install python-dev python-pip libxml2-dev libxslt1-dev zlib1g-dev libffi-dev libssl-dev4.用pip安裝scrapysudo pip install scrapy

?2.創建爬蟲項目 

scrapy startproject mySpider

3.在當前目錄下輸入命令,將在mySpider/spider目錄下創建一個名為itcast的爬蟲,并指定爬取域的

scrapy genspider itcast 'itcast.cn'

4.items 創建類 主要用來存數據的 有點像mode里面的orm

1 import scrapy 2 3 4 class MyspiderItem(scrapy.Item): 5 # define the fields for your item here like: 6 # name = scrapy.Field() 7 8 name = scrapy.Field() 9 title = scrapy.Field() 10 info= scrapy.Field()

5.spiders 文件里面剛才創建的爬蟲

# -*- coding: utf-8 -*- import scrapy from mySpider.items import MyspiderItemclass ChuanzhiSpider(scrapy.Spider):name = 'chuanzhi'allowed_domains = ['itcast.cn']start_urls = ['http://www.itcast.cn/channel/teacher.shtml#apython']def parse(self, response):# with open("teacher.html", "w") as f:# f.write(response.body)# 通過scrapy自帶的xpath匹配出所有老師的根節點列表集合teacher_list = response.xpath('//div[@class="li_txt"]')# 所有老師信息的列表集合teacherItem = []# 遍歷根節點集合for each in teacher_list:# Item對象用來保存數據的item = MyspiderItem()# name, extract() 將匹配出來的結果轉換為Unicode字符串# 不加extract() 結果為xpath匹配對象#extract_first 直接提取第一個不用加下標取值name = each.xpath('./h3/text()').extract_first()# titletitle = each.xpath('./h4/text()').extract()# infoinfo = each.xpath('./p/text()').extract()item['name'] = name# item['title'] = title[0]# item['info'] = info[0]# item['name'] = name[0]# item['title'] = title[0]# item['info'] = info[0]#yield item teacherItem.append(item)# print name[0]# print title[0]# print info[0]return teacherItem

注意:運行用命令 scrapy? crawl? itcast? ?--nolog 參數--nolog不顯示執行中的其它信息 可以不加    導出的命令? scrapy crawl itcast -o test.json/test.csv  

實例:

  items文件

1 import scrapy 2 3 class cqitItme(scrapy.Item): 4 pageText = scrapy.Field() 5 hrefText = scrapy.Field()

爬蟲文件

1 import scrapy 2 from scrapy.selector import Selector, XmlXPathSelector 3 from scrapy.http import Request 4 from ..items import cqitItme 5 6 7 class CqitSpider(scrapy.Spider): 8 name = 'cqit' 9 allowed_domains = ['cqsq.com'] #注意這個域名范圍  不能寫成 'www.cqsq.com' 或者'cqsq.com/' 10 start_urls = ['https://www.cqsq.com/list/7'] 11 set_href = [] 12 13 def parse(self, response): 14 a = Selector(response=response).xpath("//div[@class= 'pages']/a") 15   #實例化items里面創建的類 以便下面賦值并返回數據到pipelines文件中去做數據處理 16 itme = cqitItme() 17 for i in a: 18 19 i1 = i.xpath('.//@href').extract_first() 20 itext = i.xpath('.//text()').extract_first() 21 22 if i1 in self.set_href or i1 == "//www.cqsq.com/list/7/50": 23 pass 24 else: 25 26 self.set_href.append(i1) 27 url1 = 'https:' + i1 28 itme['pageText'] =itext 29 itme['hrefText'] =url1 30 31 print(url1) 32   #這里是返回實例數據并提交到pipelines文件中去處理 33 yield itme 34 #發送新的url到控制的陣列里去等去等待下次扏行  注意dont_filter去重參數 true是代表不去重 默認為false 35 yield Request(url=url1, callback=self.parse, dont_filter=True)

?

?

pipelines文件

1 class dyspiderPipeline(object):  #注意在settings文件中去設置該類的權重 2 3 def __init__(self): 4 self.f = open('test1','w') 5 def process_item(self, item, spider):#這里的itm就是爬蟲文件k yield回來的數據 6 import json 7 content = json.dumps(dict(item),ensure_ascii=False)+'\n' 8 self.f.write(content) 9 return item

?setting 配置文件 

?

ITEM_PIPELINES = {'mySpider.pipelines.MyspiderPipeline': 300,'mySpider.pipelines.dyspiderPipeline': 300, #PIPELINENS 注冊的位置 300代表的是權重 }DEPTH_LIMIT = 2 #深度為2 如果為0的話就是代表沒有深度 DUPEFILTER_CLASS = "mySpider.spiders.repeatfilter.Repeat" #自定義去重的路徑

?自定義去重 重寫yield Rquest(url = url ,callback = self.parse ,dont_filter = False ) #false 代表的就是去重 默認調用的是??#from scrapy.dupefilters import RFPDupeFilter? ?

重構代碼: 新建一個repeatfilter 的python文件  導入方法看上面setting配置文件里面的設置

1 class Repeat(object): 2 def __init__(self):
       '''第二步執行 構造函數'''
3 self.visited_set = [] 4 @classmethod 5 def from_settings(cls, settings):
      '''這里是第一步執行 相當于是obj = Repeat.from_settings'''
6 return cls() 7 8 def request_seen(self, request):
    '''第里是第四步執行 主要是判斷羅輯的'''
9 10 if request.url in self.visited_set or request.url == "https://www.cqsq.com/list/7/50": 11 12 return True 13 else: 14 self.visited_set.append(request.url) 15 16 return False 17 18 19 20 def open(self): # can return deferred 21 # print('open') 第三步執行 22 pass 23 24 def close(self, reason): # can return a deferred 25 # print('close') 第5步執行 26 pass 27 def log(self, request, spider): # log that a request has been filtered 28 # print('log....') 最后執行的日志 29 pass

pipeline補充

1 from scrapy.exceptions import DropItem 2 3 class Day96Pipeline(object): 4 5 def __init__(self,conn_str): 6 '''第二步''' 7 self.conn_str = conn_str 8 9 @classmethod 10 def from_crawler(cls, crawler): 11 """ 12 初始化時候,用于創建pipeline對象 13 :param crawler: 14 :return: 15 第一步 16 """ 17 conn_str = crawler.settings.get('DB') 18 return cls(conn_str) 19 20 def open_spider(self,spider): 21 """ 22 第三步 23 爬蟲開始執行時,調用 24 :param spider: 25 :return: 26 """ 27 self.conn = open(self.conn_str, 'a') 28 29 def close_spider(self,spider): 30 """ 31 第五步 32 爬蟲關閉時,被調用 33 :param spider: 34 :return: 35 """ 36 self.conn.close() 37 38 def process_item(self, item, spider): 39 """ 40 第四步 41 每當數據需要持久化時,就會被調用 42 :param item: 43 :param spider: 44 :return: 45 """ 46 # if spider.name == 'chouti' 47 tpl = "%s\n%s\n\n" %(item['title'],item['href']) 48 self.conn.write(tpl) 49 # 交給下一個pipeline處理 50 return item 51 # 丟棄item,不交給 52 # raise DropItem() 53 54 class Day97Pipeline(object): 55 56 def __init__(self,conn_str): 57 self.conn_str = conn_str 58 59 @classmethod 60 def from_crawler(cls, crawler): 61 """ 62 初始化時候,用于創建pipeline對象 63 :param crawler: 64 :return: 65 """ 66 conn_str = crawler.settings.get('DB') 67 return cls(conn_str) 68 69 def open_spider(self,spider): 70 """ 71 爬蟲開始執行時,調用 72 :param spider: 73 :return: 74 """ 75 self.conn = open(self.conn_str, 'a') 76 77 def close_spider(self,spider): 78 """ 79 爬蟲關閉時,被調用 80 :param spider: 81 :return: 82 """ 83 self.conn.close() 84 85 def process_item(self, item, spider): 86 """ 87 每當數據需要持久化時,就會被調用 88 :param item: 89 :param spider: 90 :return: 91 """ 92 # if spider.name == 'chouti' 93 tpl = "%s\n%s\n\n" %(item['title'],item['href']) 94 self.conn.write(tpl) 95 96 #這幾個方法的套路和上面自定義去重是一樣的執行套路  注意process_itme里面return itme 代表交給下個權重執行 如果是return Dropitme() 則代表拋異常 不交給下個執行 ?

?

轉載于:https://www.cnblogs.com/qq769080870/p/9051142.html

總結

以上是生活随笔為你收集整理的day96 scrapy的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。