全棧資料的爬取
如何傳送post請求:
yield scrapy.fromrequest(url=new_url,callback=self.parse,formdata={})
五大核心元件(物件)
如何適當提公升scrapy爬取資料的效率
增加併發:
預設scrapy開啟的併發執行緒為16個,可以適當進行增加。在settings配置檔案中修改concurrent_requests = 100值為100,併發設定成了為100。
降低日誌級別:
在執行scrapy時,會有大量日誌資訊的輸出,為了減少cpu的使用率。可以設定log輸出資訊為info或者error即可。在配置檔案中編寫:log_level = 『error』
禁止cookie:
如果不是真的需要cookie,則在scrapy爬取資料時可以禁止cookie從而減少cpu的使用率,提公升爬取效率。在配置檔案中編寫:cookies_enabled = false
禁止重試:
對失敗的http進行重新請求(重試)會減慢爬取速度,因此可以禁止重試。在配置檔案中編寫:retry_enabled = false
請求傳參
需求:爬取名稱和簡介,
實現流程
**實現:
# -*- coding: utf-8 -*-
import scrapy
class mvspidersspider(scrapy.spider):
name = 'mvspiders'
# allowed_domains = ['']
start_urls = ['']
url = ""
pagenum = 1
def parse(self, response):
li_list = response.xpath('/html/body/div[1]/div/div/div/div[2]/ul/li')
for li in li_list:
a_href = li.xpath('./div/a/@href').extract_first()
url = '' + a_href
# 對詳情頁的url進行手動請求傳送
# 請求傳參:
# 引數meta是乙個字典,字典會傳遞給callback
yield scrapy.request(url,callback=self.infoparse)
# 用於全棧的爬取
if self.pagenum < 5:
self.pagenum += 1
new_url = self.url%self.pagenum
# 遞迴呼叫自己
yield scrapy.request(new_url,callback=self.parse)
def infoparse(self,response):
title = response.xpath("/html/body/div[1]/div/div/div/div[2]/h1/text()").extract_first()
content = response.xpath('/html/body/div[1]/div/div/div/div[2]/p[5]/span[2]/text()').extract_first()
items.py
檔案中的,它的作用就是為了定義你需要給上邊檔案中的item
封裝資料就必須要在這個類中新增對應的資料名,後邊的scrapy.field()
就是內建字典類(dict)的乙個別名,並沒有提供額外的方法和屬性,被用來基於類屬性的方法來支援item生命語法。
# -*- coding: utf-8 -*-
# define here the models for your scraped items
## see documentation in:
# import scrapy
class mvitem(scrapy.item):
# define the fields for your item here like:
title = scrapy.field()
content = scrapy.field()
pipelines.py
檔案中多種資料儲存的方法
# -*- coding: utf-8 -*-
# define your item pipelines here
## don't forget to add your pipeline to the item_pipelines setting
# see:
#寫入到文字檔案中
import pymysql
from redis import redis
class duanzipropipeline(object):
fp = none
def open_spider(self,spider):
print('開始爬蟲......')
self.fp = open('./duanzi.txt','w',encoding='utf-8')
#方法每被呼叫一次,引數item就是其接收到的乙個item型別的物件
def process_item(self, item, spider):
# print(item)#item就是乙個字典
self.fp.write(item['title']+':'+item['content']+'\n')
return item#可以將item提交給下乙個即將被執行的管道類
def close_spider(self,spider):
self.fp.close()
print('爬蟲結束!!!')
#將資料寫入到mysql
class mysqlpipeline(object):
conn = none
cursor = none
def open_spider(self,spider):
self.conn = pymysql.connect(host='127.0.0.1',port=3306,user='root',password='222',db='spider',charset='utf8')
print(self.conn)
def process_item(self,item,spider):
sql = 'insert into duanzi values ("%s","%s")'%(item['title'],item['content'])
self.cursor = self.conn.cursor()
try:
self.cursor.execute(sql)
self.conn.commit()
except exception as e:
print(e)
self.conn.rollback()
return item
def close_spider(self,spider):
self.cursor.close()
self.conn.close()
#將資料寫入到redis
class redispileline(object):
conn = none
def open_spider(self,spider):
self.conn = redis(host='127.0.0.1',port=6379)
print(self.conn)
def process_item(self,item,spider):
self.conn.lpush('duanzidata',item)
return item
scrapy 基於管道的持久化儲存操作
scrapy框架中已經為我們專門整合好了高效 便捷的持久化操作功能,我們直接使用即可。這兩個元件配合爬蟲檔案實現資料持久化 items.py 資料結構模板檔案。定義資料屬性。pipelines.py 管道檔案。接收資料 items 進行持久化操作。持久化流程 1.爬蟲檔案爬取到資料後,需要將資料封裝...
Scrapy 框架(二)資料的持久化
scrapy資料的持久化 將資料儲存到資料庫 執行 scrapy genspider t crawl read www.dushu.com 檢視 read.pyclass readspider crawlspider 注 專案更改了預設模板,使其具有遞迴性 在 解析html內容的時候,可以根據鏈結規...
基於python的 scrapy框架使用步驟
coding utf 8 scrapy 的基本用法 1.通過命令建立專案 scrapy startproject 專案名稱 2.用pycharm 開啟專案 3.通過命令建立爬蟲 scrapy genspider 爬蟲名稱 網域名稱 4.配置settings robots obey false dow...