免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

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

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

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

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

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

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

scrapy startproject mySpider

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

每個文件對應(yīng)的意思為

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

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

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

scrapy genspider 高考www.gaokaopai.com

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

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

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

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

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

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

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

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

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

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

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

import scrapyfrom scrapy import FormRequestimport jsonfrom items import MyspiderItemclass GaokaoSpider(scrapy.Spider):    name = 'GaoKao'    allowed_domains = ['gaokaopai.com']    start_url = 'http://www.gaokaopai.com/rank-index.html'    def __init__(self):        self.headers = {            "User-Agent":"自己找個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)頁內(nèi)容,這個地方,需要用到1個知識點(diǎn)是

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

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

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

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

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

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

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

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

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

pycharm在運(yùn)行過程中,會在控制臺打印很多紅色的字,沒事,那不是BUG

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

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

import scrapyclass 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ù),判斷通過response.headers["Content-Type"]去確定本。頁面的英文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ù),不要使用收益。這樣子的解析就會被當(dāng)做一個生成器.scarpy將解析生成的數(shù)據(jù),逐一返回
  2. 如果返回值是請求則加入爬取隊(duì)列,如果是項(xiàng)目類型,則交給管道出來,其他類型報(bào)錯

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

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

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

import osimport csvclass 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迎

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

來源:https://www.icode9.com/content-1-349351.html
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報(bào)
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
從原理到實(shí)戰(zhàn),一份詳實(shí)的 Scrapy 爬蟲教程,值得收藏
Scrapy之路第一篇
scrapy終端常用命令
Python爬蟲教程使用Scrapy框架爬取小說代碼示例
Python 爬蟲(六):使用 Scrapy 爬取去哪兒網(wǎng)景區(qū)信息
小白學(xué) Python 爬蟲(34):爬蟲框架 Scrapy 入門基礎(chǔ)(二)
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服