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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python网络爬虫(14)使用Scrapy搭建爬虫框架

發布時間:2025/3/15 python 12 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python网络爬虫(14)使用Scrapy搭建爬虫框架 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目的意義

爬蟲框架也許能簡化工作量,提高效率等。scrapy是一款方便好用,拓展方便的框架。

本文將使用scrapy框架,示例爬取自己博客中的文章內容。

說明

學習和模仿來源:https://book.douban.com/subject/27061630/。

創建scrapy工程

首先當然要確定好,有沒有完成安裝scrapy。在windows下,使用pip install scrapy,慢慢等所有依賴和scrapy安裝完畢即可。然后輸入scrapy到cmd中測試。

建立工程使用scrapy startproject myTestProject,會在工程下生成文件。

一些介紹說明

在生成的文件中,

創建爬蟲模塊-下載

在路徑./myTestProject/spiders下,放置用戶自定義爬蟲模塊,并定義好name,start_urls,parse()。

如在spiders目錄下建立文件CnblogSpider.py,并填入以下:

import scrapy class CnblogsSpider(scrapy.Spider):name="cnblogs"start_urls=["https://www.cnblogs.com/bai2018/default.html?page=1"]def parse(self,response):pass

?在cmd中,切換到./myTestProject/myTestProject下,再執行scrapy crawl cnblogs(name)測試,觀察是否報錯,響應代碼是否為200。其中的parse中參數response用于解析數據,讀取數據等。

強化爬蟲模塊-解析

在CnblogsSpider類中的parse方法下,添加解析功能。通過xpath、css、extract、re等方法,完成解析。

調取元素審查分析以后添加,成為以下代碼:

import scrapy class CnblogsSpider(scrapy.Spider):name="cnblogs"start_urls=["https://www.cnblogs.com/bai2018/"]def parse(self,response):papers=response.xpath(".//*[@class='day']")for paper in papers:url=paper.xpath(".//*[@class='postTitle']/a/@href").extract()title=paper.xpath(".//*[@class='postTitle']/a/text()").extract()time=paper.xpath(".//*[@class='dayTitle']/a/text()").extract()content=paper.xpath(".//*[@class='postCon']/div/text()").extract()print(url,title,time,content)pass

?找到頁面中,class為day的部分,然后再找到其中各個部分,提取出來,最后通過print方案輸出用于測試。

在正確的目錄下,使用cmd運行scrapy crawl cnblogs,完成測試,并觀察顯示信息中的print內容是否符合要求。

強化爬蟲模塊-包裝數據

包裝數據的目的是存儲數據。scrapy使用Item類來滿足這樣的需求。

框架中的items.py用于定義存儲數據的Item類。

在items.py中修改MytestprojectItem類,成為以下代碼:

import scrapy class MytestprojectItem(scrapy.Item):# define the fields for your item here like:# name = scrapy.Field()url=scrapy.Field()time=scrapy.Field()title=scrapy.Field()content=scrapy.Field()pass

?然后修改CnblogsSpider.py,成為以下內容:

import scrapy from myTestProject.items import MytestprojectItem class CnblogsSpider(scrapy.Spider):name="cnblogs"start_urls=["https://www.cnblogs.com/bai2018/"]def parse(self,response):papers=response.xpath(".//*[@class='day']")for paper in papers:url=paper.xpath(".//*[@class='postTitle']/a/@href").extract()title=paper.xpath(".//*[@class='postTitle']/a/text()").extract()time=paper.xpath(".//*[@class='dayTitle']/a/text()").extract()content=paper.xpath(".//*[@class='postCon']/div/text()").extract()item=MytestprojectItem(url=url,title=title,time=time,content=content)yield itempass

?將提取出的內容封裝成Item對象,使用關鍵字yield提交。

強化爬蟲模塊-翻頁

有時候就是需要翻頁,以獲取更多數據,然后解析。

修改CnblogsSpider.py,成為以下內容:

import scrapy from scrapy import Selector from myTestProject.items import MytestprojectItem class CnblogsSpider(scrapy.Spider):name="cnblogs"allowd_domains=["cnblogs.com"]start_urls=["https://www.cnblogs.com/bai2018/"]def parse(self,response):papers=response.xpath(".//*[@class='day']")for paper in papers:url=paper.xpath(".//*[@class='postTitle']/a/@href").extract()title=paper.xpath(".//*[@class='postTitle']/a/text()").extract()time=paper.xpath(".//*[@class='dayTitle']/a/text()").extract()content=paper.xpath(".//*[@class='postCon']/div/text()").extract()item=MytestprojectItem(url=url,title=title,time=time,content=content)yield itemnext_page=Selector(response).re(u'<a href="(\S*)">下一頁</a>')if next_page:yield scrapy.Request(url=next_page[0],callback=self.parse)pass

在scrapy的選擇器方面,使用xpath和css,可以直接將CnblogsSpider下的parse方法中的response參數使用,如response.xpath或response.css。

而更通用的方式是:使用Selector(response).xxx。針對re則為Selector(response).re。

關于yield的說明:https://blog.csdn.net/mieleizhi0522/article/details/82142856

強化爬蟲模塊-存儲

當Item在Spider中被收集時候,會傳遞到Item Pipeline。

修改pipelines.py成為以下內容:

import json from scrapy.exceptions import DropItem class MytestprojectPipeline(object):def __init__(self):self.file=open('papers.json','wb')def process_item(self, item, spider):if item['title']:line=json.dumps(dict(item))+"\n"self.file.write(line.encode())return itemelse:raise DropItem("Missing title in %s"%item)

?重新實現process_item方法,收集item和該item對應的spider。然后創建papers.json,轉化item為字典,存儲到json表中。

另外,根據提示打開pipelines.py的開關。在settings.py中,使能ITEM_PIPELINES的開關如下:

然后在cmd中執行scrapy crawl cnblogs即可

?另外,還可以使用scrapy crawl cnblogs -o papers.csv進行存儲為csv文件。

需要更改編碼,將csv文件以記事本方式重新打開,更正編碼后重新保存,查看即可。

強化爬蟲模塊-圖像下載保存

設定setting.py

ITEM_PIPELINES = {'myTestProject.pipelines.MytestprojectPipeline':300,'scrapy.pipelines.images.ImagesPipeline':1 } IAMGES_STORE='.//cnblogs' IMAGES_URLS_FIELD = 'cimage_urls' IMAGES_RESULT_FIELD = 'cimages' IMAGES_EXPIRES = 30 IMAGES_THUMBS = {'small': (50, 50),'big': (270, 270) }

?修改items.py為:

import scrapy class MytestprojectItem(scrapy.Item):# define the fields for your item here like:# name = scrapy.Field()url=scrapy.Field()time=scrapy.Field()title=scrapy.Field()content=scrapy.Field()cimage_urls=scrapy.Field()cimages=scrapy.Field()pass

?修改CnblogsSpider.py為:

import scrapy from scrapy import Selector from myTestProject.items import MytestprojectItem class CnblogsSpider(scrapy.Spider):name="cnblogs"allowd_domains=["cnblogs.com"]start_urls=["https://www.cnblogs.com/bai2018/"]def parse(self,response):papers=response.xpath(".//*[@class='day']")for paper in papers:url=paper.xpath(".//*[@class='postTitle']/a/@href").extract()[0]title=paper.xpath(".//*[@class='postTitle']/a/text()").extract()time=paper.xpath(".//*[@class='dayTitle']/a/text()").extract()content=paper.xpath(".//*[@class='postCon']/div/text()").extract()item=MytestprojectItem(url=url,title=title,time=time,content=content)request=scrapy.Request(url=url, callback=self.parse_body)request.meta['item']=itemyield requestnext_page=Selector(response).re(u'<a href="(\S*)">下一頁</a>')if next_page:yield scrapy.Request(url=next_page[0],callback=self.parse)passdef parse_body(self, response):item = response.meta['item']body = response.xpath(".//*[@class='postBody']")item['cimage_urls'] = body.xpath('.//img//@src').extract()yield item

總之,修改以上三個位置。在有時候配置正確的時候卻出現圖像等下載失敗,則可能是由于setting.py的原因,需要重新修改。

啟動爬蟲

建立main函數,傳遞初始化信息,導入指定類。如:

from scrapy.crawler import CrawlerProcess from scrapy.utils.project import get_project_settingsfrom myTestProject.spiders.CnblogSpider import CnblogsSpiderif __name__=='__main__':process = CrawlerProcess(get_project_settings())process.crawl('cnblogs')process.start()

修正

import scrapy from scrapy import Selector from cnblogSpider.items import CnblogspiderItem class CnblogsSpider(scrapy.Spider):name="cnblogs"allowd_domains=["cnblogs.com"]start_urls=["https://www.cnblogs.com/bai2018/"]def parse(self,response):papers=response.xpath(".//*[@class='day']")for paper in papers:urls=paper.xpath(".//*[@class='postTitle']/a/@href").extract()titles=paper.xpath(".//*[@class='postTitle']/a/text()").extract()times=paper.xpath(".//*[@class='dayTitle']/a/text()").extract()contents=paper.xpath(".//*[@class='postCon']/div/text()").extract()for i in range(len(urls)):url=urls[i]title=titles[i]time=times[0]content=contents[i]item=CnblogspiderItem(url=url,title=title,time=time,content=content)request = scrapy.Request(url=url, callback=self.parse_body)request.meta['item'] = itemyield requestnext_page=Selector(response).re(u'<a href="(\S*)">下一頁</a>')if next_page:yield scrapy.Request(url=next_page[0],callback=self.parse)passdef parse_body(self, response):item = response.meta['item']body = response.xpath(".//*[@class='postBody']")item['cimage_urls'] = body.xpath('.//img//@src').extract()yield item

我的博客即將同步至騰訊云+社區,邀請大家一同入駐:https://cloud.tencent.com/developer/support-plan?invite_code=813cva9t28s6

轉載于:https://www.cnblogs.com/bai2018/p/11255185.html

總結

以上是生活随笔為你收集整理的python网络爬虫(14)使用Scrapy搭建爬虫框架的全部內容,希望文章能夠幫你解決所遇到的問題。

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