乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      Python爬蟲入門【17】:高考派大學(xué)數(shù)據(jù)抓取 scrapy

       印度阿三17 2019-07-23

      1.高考派大學(xué)數(shù)據(jù)----寫在前面

      寫到終于了scrapy爬蟲框架了,這個(gè)框架可以說(shuō)是蟒爬蟲框架里面出鏡率最高的一個(gè)了,我們接下來(lái)重點(diǎn)研究一下它的使用規(guī)則。

      安裝過(guò)程自己百度一下,就能找到3種以上的安裝手法,一個(gè)哪都可以安裝上
      可以參考https://scrapy-chs./zh_CN/0.24/intro/install.html官方說(shuō)明進(jìn)行安裝。

      2.高考派大學(xué)數(shù)據(jù)----創(chuàng)建scrapy項(xiàng)目

      通用使用下面的命令,創(chuàng)建即可

      scrapy startproject mySpider

      完成之后,你的項(xiàng)目的目錄結(jié)構(gòu)為

      每個(gè)文件對(duì)應(yīng)的意思為

      • scrapy.cfg項(xiàng)目的配置文件
      • mySpider /根目錄
      • mySpider / items.py項(xiàng)目的目標(biāo)文件,規(guī)范數(shù)據(jù)格式,用來(lái)定義解析對(duì)象對(duì)應(yīng)的屬性或字段。
      • mySpider / pipelines.py項(xiàng)目的管道文件,負(fù)責(zé)處理被蜘蛛提取出來(lái)的項(xiàng)目。典型的處理有清理,驗(yàn)證及持久化(例如存取到數(shù)據(jù)庫(kù))
      • mySpider / settings.py項(xiàng)目的設(shè)置文件
      • mySpider / spiders /爬蟲主目錄
      • * Spider中間件是在引擎及Spider之間的特定鉤子(具體鉤子),處理蜘蛛的輸入(響應(yīng))和輸出(items及requests)。其提供了一個(gè)簡(jiǎn)便的機(jī)制,通過(guò)插入自定義代碼來(lái)擴(kuò)展Scrapy功能。*本篇文章沒(méi)有涉及

      高考派大學(xué)數(shù)據(jù)----創(chuàng)建Scrapy爬蟲

      通過(guò)命令行進(jìn)入到mySpider / spiders /目錄,然后執(zhí)行如下命令

      scrapy genspider 高考www.

      打開mySpider / spiders /目錄里面的高考,默認(rèn)增加了下列代碼

      import scrapy
      
      class GaoKaoSpider(scrapy.Spider):
          name = "GaoKao"
          allowed_domains = ["www."]
          start_urls = ['http://www./']
      
          def parse(self, response):
              pass
      
      

      默認(rèn)生成的代碼,一個(gè)所有游戲GaoKaoSpider的類,這個(gè)并且類的英文用scrapy.Spider繼承來(lái)的
      而且默認(rèn)實(shí)現(xiàn)了三個(gè)屬性狀語(yǔ)從句:一個(gè)方法

      name =“”這個(gè)是爬蟲的名字,必須唯一,在不同的爬蟲需要定義不同的名字
      allowed_domains = []域名范圍,限制爬蟲爬取當(dāng)前域名下的網(wǎng)頁(yè)
      start_urls = []爬取的URL元組/列表。爬蟲從這里開始爬取數(shù)據(jù),第一次爬取的頁(yè)面就是從這里開始,其他的URL將會(huì)從這些起始的URL爬取的結(jié)果中生成
      解析(self,response)解析網(wǎng)頁(yè)的方法, -個(gè)初始網(wǎng)址完成下載后將調(diào)用,調(diào)用的時(shí)候傳入每一個(gè)初始URL返回的響應(yīng)對(duì)象作為唯一參數(shù),主要作用1、負(fù)責(zé)解析返回的網(wǎng)頁(yè)數(shù)據(jù),response.body 2、生成下一頁(yè)的URL請(qǐng)求

      高考派大學(xué)數(shù)據(jù)----第一個(gè)案例

      要我們爬取的的英文高考派大學(xué)數(shù)據(jù)數(shù)據(jù)為http://www./rank-index.html

      頁(yè)面下部有一個(gè)加載更多,點(diǎn)擊抓取鏈接

      尷尬的事情發(fā)生了,竟然是一個(gè)POST請(qǐng)求,本打算實(shí)現(xiàn)一個(gè)GET的,這回代碼量有點(diǎn)大了?

      scrapy模式是GET請(qǐng)求的,如果我們需要修改成POST,那么需要重寫Spider類的start_requests(self)方法,并且不再調(diào)用start_urls里面的url了,所以,咱對(duì)代碼進(jìn)行一些修改。重寫代碼之后,注意下面這段代碼

      request = FormRequest(self.start_url,headers=self.headers,formdata=form_data,callback=self.parse)
      
      

      FormRequest需要引入模塊from scrapy import FormRequest
      self.start_url寫上帖請(qǐng)求的地址即可formdata
      用來(lái)提交表單數(shù)據(jù)
      callback調(diào)用網(wǎng)頁(yè)解析參數(shù)
      最后的yield請(qǐng)求表示這個(gè)函數(shù)是一個(gè)生成器

      import scrapy
      from scrapy import FormRequest
      import json
      
      from items import MyspiderItem
      class GaokaoSpider(scrapy.Spider):
          name = 'GaoKao'
          allowed_domains = ['']
          start_url = 'http://www./rank-index.html'
      
          def __init__(self):
              self.headers = {
                  "User-Agent":"自己找個(gè)UA",
                  "X-Requested-With":"XMLHttpRequest"
              }
      
          # 需要重寫start_requests() 方法
          def start_requests(self):
              for page in range(0,7):
                  form_data = {
                      "otype": "4",
                      "city":"",
                      "start":str(25*page),
                      "amount": "25"
                  }
      
                  request = FormRequest(self.start_url,headers=self.headers,formdata=form_data,callback=self.parse)
                  yield request
      
          def parse(self, response):
              print(response.body)
              print(response.url)
              print(response.body_as_unicode())
      Python資源分享qun 784758214 ,內(nèi)有安裝包,PDF,學(xué)習(xí)視頻,這里是Python學(xué)習(xí)者的聚集地,零基礎(chǔ),進(jìn)階,都?xì)g迎
      

      在我們def parse(self, response):函數(shù)里面,輸出一下網(wǎng)頁(yè)內(nèi)容,這個(gè)地方,需要用到1個(gè)知識(shí)點(diǎn)是

      獲取網(wǎng)頁(yè)內(nèi)容 response.body response.body_as_unicode()

      • response.url獲取抓取的RUL
      • response.body獲取網(wǎng)頁(yè)內(nèi)容字節(jié)類型
      • response.body_as_unicode()獲取網(wǎng)站內(nèi)容字符串類型

      我們接下來(lái)就可以運(yùn)行一下爬蟲程序了

      項(xiàng)目在根目錄創(chuàng)建33一個(gè)begin.py文件,里面寫入如下代碼

      from scrapy import cmdline
      cmdline.execute(("scrapy crawl GaoKao").split())
      
      

      運(yùn)行該文件,記住在scrapy中的其他py文件中,運(yùn)行是不會(huì)顯示相應(yīng)的結(jié)果的,每次測(cè)試的時(shí)候,都需要運(yùn)行begin.py當(dāng)然,你可起一個(gè)其他的名字。

      如果你不這么干的,那么你只能采用下面的操作,就是比較麻煩。

      cd到爬蟲目錄里執(zhí)行scrapy crawl GaoKao--nolog命令
      說(shuō)明:scrapy crawl GaoKao(GaoKao表示爬蟲名稱) --nolog(--nolog表示不顯示日志)
      
      

      運(yùn)行起來(lái),就在控制臺(tái)打印數(shù)據(jù)了,測(cè)試方便,可以把上述代碼中那個(gè)數(shù)字7,修改成2,有心人能看到我這個(gè)小文字

      pycharm在運(yùn)行過(guò)程中,會(huì)在控制臺(tái)打印很多紅色的字,沒(méi)事,那不是BUG

      一定要在紅色的字中間找到黑色的字,黑色的字才是你打印出來(lái)的數(shù)據(jù),如下,得到這樣的內(nèi)容,就成功一大半了。

      但是這個(gè)地方有個(gè)小坑,就是,你會(huì)發(fā)現(xiàn)返回的數(shù)據(jù)不一致,這個(gè)我測(cè)試了一下,是因?yàn)榈谝豁?yè)的數(shù)據(jù)返回的不是JSON格式的,而是普通的網(wǎng)頁(yè),那么我們需要針對(duì)性處理一下,這個(gè)先不用管,把我們items.py進(jìn)行完善

      
      import scrapy
      class MyspiderItem(scrapy.Item):
          # 學(xué)校名稱
          uni_name = scrapy.Field()
          uni_id = scrapy.Field()
          city_code = scrapy.Field()
          uni_type = scrapy.Field()
          slogo = scrapy.Field()
          # 錄取難度
          safehard = scrapy.Field()
          # 院校所在地
          rank = scrapy.Field()
      
      

      然后在剛才的GaokaoSpider類中,繼續(xù)完善解析函數(shù),判斷通過(guò)response.headers["Content-Type"]去確定本。頁(yè)面的英文HTML格式,還是JSON格式。

              if(content_type.find("text/html")>0):
                  # print(response.body_as_unicode())
                  trs = response.xpath("http://table[@id='results']//tr")[1:]
                  for item in trs:
                      school = MyspiderItem()
                      rank = item.xpath("td[1]/span/text()").extract()[0]
                      uni_name = item.xpath("td[2]/a/text()").extract()[0]
                      safehard  = item.xpath("td[3]/text()").extract()[0]
                      city_code = item.xpath("td[4]/text()").extract()[0]
                      uni_type = item.xpath("td[6]/text()").extract()[0]
      
                      school["uni_name"] = uni_name
                      school["uni_id"] = ""
                      school["city_code"] = city_code
                      school["uni_type"] = uni_type
                      school["slogo"] = ""
                      school["rank"] = rank
                      school["safehard"] = safehard
                      yield school
      
              else:
                  data = json.loads(response.body_as_unicode())
                  data = data["data"]["ranks"] # 獲取數(shù)據(jù)
      
                  for item in data:
                      school = MyspiderItem()
                      school["uni_name"] = item["uni_name"]
                      school["uni_id"] = item["uni_id"]
                      school["city_code"] = item["city_code"]
                      school["uni_type"] = item["uni_type"]
                      school["slogo"] = item["slogo"]
                      school["rank"] = item["rank"]
                      school["safehard"] = item["safehard"]
                      # 將獲取的數(shù)據(jù)交給pipelines,pipelines在settings.py中定義
                      yield school
      
      

      parse()方法的執(zhí)行機(jī)制

      1. 使用產(chǎn)量返回?cái)?shù)據(jù),不要使用收益。這樣子的解析就會(huì)被當(dāng)做一個(gè)生成器.scarpy將解析生成的數(shù)據(jù),逐一返回
      2. 如果返回值是請(qǐng)求則加入爬取隊(duì)列,如果是項(xiàng)目類型,則交給管道出來(lái),其他類型報(bào)錯(cuò)

      到這里,如果想要數(shù)據(jù)準(zhǔn)備的進(jìn)入到管道中,你需要在setting.py中將配置開啟

          # See https://doc./en/latest/topics/item-pipeline.html
          ITEM_PIPELINES = {
             'mySpider.pipelines.MyspiderPipeline': 300,
          }
      
      

      關(guān)系編寫同時(shí)pipeline.py文件

      import os
      import csv
      
      class MyspiderPipeline(object):
      
          def __init__(self):
              # csv 文件
              store_file = os.path.dirname(__file__) "/spiders/school1.csv"
              self.file = open(store_file,"a ",newline='',encoding="utf-8")
              self.writer = csv.writer(self.file)
      
          def process_item(self, item, spider):
              try:
      
                  self.writer.writerow((
                      item["uni_name"],
                      item["uni_id"],
                      item["city_code"],
                      item["uni_type"],
                      item["slogo"],
                      item["rank"],
                      item["safehard"]
                  ))
      
              except Exception as e:
                  print(e.args)
      
          def close_spider(self,spider):
              self.file.close()
      Python資源分享qun 784758214 ,內(nèi)有安裝包,PDF,學(xué)習(xí)視頻,這里是Python學(xué)習(xí)者的聚集地,零基礎(chǔ),進(jìn)階,都?xì)g迎
      

      好了,代碼全部編寫完畢,還是比較簡(jiǎn)單的吧,把上面的數(shù)字在修改成圖7,為啥是7,因?yàn)橹荒塬@取到前面150條數(shù)據(jù)

      來(lái)源:https://www./content-1-349351.html

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多