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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

使用Spider提取数据(爬取起点中文网)

發布時間:2023/12/14 编程问答 63 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用Spider提取数据(爬取起点中文网) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
  • 首先介紹Scrapy中最重要的組件爬蟲(Spider),它用于構建HTTP請求并從網頁中提取數據;接著介紹使用Item封裝數據;最后介紹使用Pipeline組件對數據進行處理,如數據清理、去重及持久化存儲等。

1.使用Spider提取數據

  • Scrapy網絡爬蟲編程的核心就是爬蟲(Spider)組件,它其實是一個繼承于Spider的類,主要功能是封裝一個發送給網站服務器的HTTP請求,解析網站返回的網頁提取數據。
  • 如何避免爬蟲網站識別出來導致被禁呢?可以重寫(override)start_requests()方法,手動生成一個功能更強大的Request對象。因為偽裝瀏覽器、自動登錄等功能都是在Request對象中設置的。
  • 引擎是怎么知道要將下載好的頁面發送給parse()方法而不是其他方法?能否自定義這個方法?引擎之所以能自動定位,是因為在Request對象中,指定了解數據的回調函數,而默認情況下,Request指定的解析函數就是parse()方法。
from scrapy import Request from scrapy.spiders import Spider# 導入Spider類 class HotSalesSpider(Spider):# 定義爬蟲名稱name = 'hot'# 設置用戶代理(瀏覽器類型)#qidian_headers = {"user-agent":" Mozilla/"#"5.0 (Windows NT 10.0;"#" Win64; x64) AppleWebKit/"#"537.36 (KHTML, like Gecko) Chrome/"#"91.0.4472.124 Safari/"# "537.36"}qidian_headers = {"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"}# 獲取初始Requesdef start_requests(self):url = "https://www.qidian.com/rank/hotsales?style=1&page=1"# 生成請求對象,設置url,headers,callbackyield Request(url,headers=self.qidian_headers,callback=self.qidian_parse)# 解析函數def qidian_parse(self,response):# 使用xpath定位到小說的div元素,保存到列表中list_selector = response.xpath("//div[@class='book-mid-info']")# 依次讀取每部小說的元素,從中獲取小說名稱、作者、類型和形式for one_selector in list_selector:# 獲取小說名稱name = one_selector.xpath("h4/a/text()").extract()[0]# 獲取作者author = one_selector.xpath("p[1]/a[1]/text()").extract()[0]# 獲取類型type = one_selector.xpath("p[1]/a[2]/text()").extract()[0]# 獲取形式(連載還是完本)form = one_selector.xpath("p[1]/span/text()").extract()[0]# 將爬取到的一部小說保存到字典中hot_dict = {"name":name,"author":author,"type":type,"form":form}# 使用yield返回字典yield hot_dict
  • Request對象設置了3個參數:
  • url:請求訪問的網址。headers:請求頭信息。callback:回調函數。這是確定解析數據的函數為qidian_parse()。引擎會將下載好的頁面(Response對象)發送給該方法,執行數據解析功能。
  • 在命令行中輸入爬蟲命令:
scrapy crawl hot -o hot.csv

打開生成的.csv文件,如圖所示

  • 通過設置Request的headers和callback參數就輕松實現了爬蟲偽裝和自定義解析函數的功能??磥鞷equst對象大有玄機,通過設定各種參數還能實現更多有用的功能。下面就來詳細了解一下Request對象

Request對象

  • Request對象用來描述一個HTTP請求,它通常在Spider中生成并由下載器執行。
  • Request的定義形式:
class Request(object_ref):def __init__(self, url, callback=None, method='GET', headers=None, body=None,cookies=None, meta=None, encoding='utf-8', priority=0,dont_filter=False, errback=None, flags=None, cb_kwargs=None):self._encoding = encoding # this one has to be set firstself.method = str(method).upper()self._set_url(url)self._set_body(body)if not isinstance(priority, int):raise TypeError(f"Request priority not an integer: {priority!r}")self.priority = priorityif callback is not None and not callable(callback):raise TypeError(f'callback must be a callable, got {type(callback).__name__}')if errback is not None and not callable(errback):raise TypeError(f'errback must be a callable, got {type(errback).__name__}')self.callback = callbackself.errback = errback
  • 其中url是必填項,其他為選填項,下面逐個介紹這些參數。
  • url:HTTP請求的網址
  • methode:HTTP請求的方法,如GET、POST、PUT等,默認為GET,必須大寫英文字母。
  • body:HTTP的請求體,類型為str或者unicode。
  • headers:HTTP的請求頭,類型為字典型。
  • cookies:請求的Cookie值,類型為字典型或列表型,可以實現自動登錄的效果。
  • encoding:請求的編碼方式,默認為UTF-8。
  • 以下參數設置Scrapy框架內部的事物。
    • callback:指定回調函數,即確定頁面解析函數,默認為parse()。頁面下載完成后,回調函數將會被調用,如果在處理期間發生異常,則會調用errback()函數。
    • meta:字典類型,用于數據的傳遞。它可以將數據傳遞給其他組件,也可傳遞給Response對象,本章的項目案例中會使用該參數。
    • priority:請求的優先級,默認為0,優先級高的會優先下載。
    • dont_filter:如果對同一個url多次提交相同的請求,可以使用此項來忽略重復的請求,避免重復下載,其值默認為False。如果設置為True,即使是重復的請求,也會強制下載,例如爬取實時變化的股票信息數據。
    • errback:在處理請求時引發任何異常時調用的函數,包括HTTP返回的404頁面不存在的錯誤。
  • Request中的參數看上去有很多,但除了url外,其他參數都有默認值,大部分情況下不必設置。
  • 介紹完Request,下面繼續研究Spider的核心:解析函數(默認為parse()函數)。它主要實現兩方面的功能:
  • 使用Scrapy的選擇器提取頁面中的數據,將其封裝后交給引擎。
  • 提取頁面中的鏈接,構造新的Request請求并提交給Scrapy引擎。

使用選擇器提取數據(selector類)

  • Scrapy提取數據有自己的一套機制,被稱為選擇器(Selector類),它能夠自有“選擇”有xpath或css表達式指定的HTML文檔中的某些部分。Scrapy的選擇器短小簡潔、解析快、準確性高,使用其內置的方法可以快速地定位和提取數據。
  • 1.定位數據
  • xpath(query):查找與xpath表達式匹配的節點 ,并返回一個SelectotList對象。SelectorList對象類似于一個列表,包含了所有匹配到的節點。參數query是Xpath表達式的字符串。
  • css(query):查找與CSS表達式匹配的節點,并返回一個SelectorList對象。參數query是CSS表達式的字符串。
  • 2.提取數據
  • extract():提取文本數據,返回unicode字符串列表。使用xpath()或者css()方法將匹配到的節點包裝為SelectorList對象后,可以使用extract()方法提取SelectorList對象中的文本,并將其存放于列表中。
  • extract_first():SelectorList獨有的方法,提取SelectorList對象中第一個文本數據,返回unicode字符串。
  • re(regex):使用正則表達式提取數據,返回所有匹配的unicode字符串列表。
  • re_first():SelectorList獨有的方法,提取第一個與正則表達式匹配的字符串。

Response對象與Xpath

  • 我們完全沒有必要手動構造一個選擇器對象來實現對網頁信息的查找與提取。因為Scrapy將下載下來的網頁信息封裝到Response對象傳遞給解析函數時,會自動構造一個選擇器作為Response對象的屬性,這樣就能通過Response對象非常方便地查找與提取網頁數據。
  • 下面來分析一下解析函數,函數框架如下:
def qidian_parse(self,response):....

參數response接收封裝有網頁信息的Response對象,這時就可以使用下面的方法實現對數據的定位。

response.selector.xpath(query) response.selector.css(query)
  • 由于在Response中使用XPath和CSS查詢十分普遍,因此Response對象提供了兩個使用的快捷方式,他們能自動創建選擇器并調用選擇器xpath()或css()方法來定位數據。簡化后的方法如下:
response.xpath(query) response.css(query)
  • 下面來看一下完整的解析函數的是實現代碼。
# 解析函數def qidian_parse(self,response):# 使用xpath定位到小說的div元素,保存到列表中list_selector = response.xpath("//div[@class='book-mid-info']")# 依次讀取每部小說的元素,從中獲取小說名稱、作者、類型和形式for one_selector in list_selector:# 獲取小說名稱name = one_selector.xpath("h4/a/text()").extract()[0]# 獲取作者author = one_selector.xpath("p[1]/a[1]/text()").extract()[0]# 獲取類型type = one_selector.xpath("p[1]/a[2]/text()").extract()[0]# 獲取形式(連載還是完本)form = one_selector.xpath("p[1]/span/text()").extract()[0]# 將爬取到的一部小說保存到字典中hot_dict = {"name":name,"author":author,"type":type,"form":form}# 使用yield返回字典yield hot_dict
  • 在第4行代碼中,使用Response的xpath()方法定位到小說信息的div元素。list_selector是一個選擇器列表,存儲有多個選擇器對象,一個選擇器對應一個div元素。
  • 第8行獲取小說名稱,首先使用xpath定位到小說名稱的文本元素,返回一個選擇器列表;然后使用extract()方法提取出文本并保存于列表中;最后再從列表中獲取文本并賦值給name。
  • 第8行代碼也可以使用extract_first()方法直接得到列表中的第一個文本,代碼修改為:
name = one_selector.xpath("h4/a/text()").extract_first()
  • 第15-19行代碼中,使用字典hot_dict保存爬取到一條小說的信息。
  • 在第21行代碼中,通過yield提交給hot_dict給引擎后 ,解析函數繼續執行解析任務。引擎接收到數據后將其交由其他組件處理,這樣做的好處是節省了大量內存(只有一條數據),提高了執行效率(解析一條,處理一條 )。如果將yield替換成return,解析函數將會立即停止。

利用settings.py將爬蟲偽裝成瀏覽器

  • 在Request中,設置參數header可以將爬蟲偽裝成瀏覽器,以避免被網站偵測到。其實,更普遍、更科學的做法是將其配置在settings.py中,Request對象每次調用時,Scrapy會自動將其加入。對于一個項目中有多個爬蟲程序來說,能有效避免重復設置的麻煩。具體實現方法為:
  • (1)在settings.py中啟動并設置User-Agent。
# Crawl responsibly by identifying yourself (and your website) on the user-agent USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
  • (2)爬蟲類中刪除相應代碼后的代碼如下
from scrapy import Request from scrapy.spiders import Spider# 導入Spider類 class HotSalesSpider(Spider):# 定義爬蟲名稱name = 'hot'# 獲取初始Requesdef start_requests(self):url = "https://www.qidian.com/rank/hotsales?style=1&page=1"# 生成請求對象,設置url,headers,callbackyield Request(url,callback=self.qidian_parse)# 解析函數def qidian_parse(self,response):# 使用xpath定位到小說的div元素,保存到列表中list_selector = response.xpath("//div[@class='book-mid-info']")# 依次讀取每部小說的元素,從中獲取小說名稱、作者、類型和形式for one_selector in list_selector:# 獲取小說名稱name = one_selector.xpath("h4/a/text()").extract()[0]# 獲取作者author = one_selector.xpath("p[1]/a[1]/text()").extract()[0]# 獲取類型type = one_selector.xpath("p[1]/a[2]/text()").extract()[0]# 獲取形式(連載還是完本)form = one_selector.xpath("p[1]/span/text()").extract()[0]# 將爬取到的一部小說保存到字典中hot_dict = {"name":name,"author":author,"type":type,"form":form}# 使用yield返回字典yield hot_dict

Response對象與CSS

  • Response也支持使用CSS表達式來解析數據。
  • CSS(Cascading Style Sheets,層疊樣式表),用于表現HTML或XML的樣式。CSS表達式的語法比XPath簡潔,但是功能不如XPath強大,大多作為XPath的輔助。
  • 常用的CSS表達式
  • 下面還是以起點中文網小說熱搜榜為例,改用CSS表達式實現數據的解析。實現代碼如下:
# 使用CSS選擇器解析數據def qidian_parse(self,response):# 使用CSS定位到小說的div元素,生成選擇器,并保存到選擇器列表中list_selector = response.css("[class='book-mid-info']")# 依次讀取每部小說的元素,從中獲取小說名稱、作者、類型和形式for one_selector in list_selector:# 獲取小說名稱name = one_selector.css("h4>a::text").extract()[0]# 獲取作者author = one_selector.css(".author a::text").extract()[0]# 獲取類型type = one_selector.css(".author a::text").extract()[1]# 獲取形式(連載還是完本)form = one_selector.css(".author span::text").extract_first()# 將爬取到的一部小說保存到字典中hot_dict = {"name":name,"author":author,"type":type,"form":form}# 使用yield返回字典yield hot_dict
  • 以上代碼中,僅將數據解析從XPath表達式替換為CSS表達式,其余沒有變化。
  • 在第4行代碼中,list_selector使用CSS表達式定位到小說信息的div元素。
  • 在第6行代碼中,獲取小說名稱的CSS表達式為h4>a::text,即定位到h4子節點a標簽的文本,返回選擇器列表,再使用extract_first()方法提取出第1個文本。
  • 在第12行代碼中,獲取小說類型的CSS表達式為 .author a::text,即定位到class屬性值為author下所有a標簽的文本,返回選擇器列表;然后使用extract()方法提取文本存儲于列表中;最后使用下標獲取列表中的第1個文本。

進一步了解Response對象

  • Response用來描述一個HTTP響應,它只是一個基類。當下載器下載完網頁后,下載器會根據HTTP響應頭部的Content-Type自動創建Response的子類對象。子類主要有:
  • TextResponse;
  • HtmlResponse;
  • XmlResponse。
  • 其中,TextResponse是HtmlResponse和XmlResponse的子類。我們通常爬取的網頁,即HTML文檔,下載器創建的便是HtmlResponse。
  • 下面以HtmlResponse為例,介紹它的屬性。
  • url:響應的url,只讀,如https://www.baidu.com
  • status:HTTP響應的狀態碼,如200、403、404。
  • headers:HTTP的響應頭,類型為自典型。
  • body:HTTP的響應體。
  • meta:用于接收傳遞的數據。使用request.meta將數據傳遞出去后,可以使用response.meta獲取數據。

總結

以上是生活随笔為你收集整理的使用Spider提取数据(爬取起点中文网)的全部內容,希望文章能夠幫你解決所遇到的問題。

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