一、使用
scrapy可以使用xpath
語法
創建一個項目scrapy startproject dome1
進入項目 cd dome1
指定項目開始爬取的範圍scrapy genspider test1 baidu.com
運行項目scrapy crawl test1
通過交互環境測試項目scrapy shell https://www.baidu.com
單詞 extract
、extract_first
、callback
連接追蹤
return scrapy.Request(next_url,callback=self.parse,dont_filter=True)
1.四大模塊
- spiders(蜘蛛,網頁爬蟲)
- 發佈需求,解析下載的內容返回給item pipelines進行保存或者交給管理者繼續處理。
- downloader(下載器)
- 需求下載地址
- scheduler(計劃員、調度器)
- 排隊等待處理
- item pipelines(項目管道)
- 對下載數據的處理(存儲)
- items.py文件是對數據定義格式類型的
- pipelines.py文件是管道處數量等處理的
- 對下載數據的處理(存儲)
spiders發佈請求並定義請求內容,對數據進行解析;downloader是下載器進行下載,主要負責對spider的請求進行下載,然後spider會對下載回來的數據進行處理,然後將有用的數據交給item pipelines,進行保存;items.py文件是定義存儲的格式的,它的使用方法與字典類似。
1.spiders
內部都是項目對應的爬蟲文件
- yield函數:碰到yield函數,那麼他就會去尋找yield賦值給了誰,然後執行yield對應的操作。然後再去執行yield下面的內容。
- yield返回的內容是交給了pipelines.py文件。
- 說一下json字符串
- dumps是編碼成json格式
- loads是解碼成python對象
2.ietms.py
定義你要爬取的字段
3.pipelines.py
開啓管道:在settings裏面搜索300,會發現一個ITEM_PIPELINES = { 'dome1.pipelines.Dome1Pipeline': 300,}
,把這個打開即爲打開管道。
1.首先開啓管道
pipelines有多個類可以多設置幾個管道 settings裏面修改配置文件 可以實現多線程
管道之間的數據可以共享
ITEM_PIPELINES = {
'myspider.pipelines.MyspiderPipeline': 299,
'myspider.pipelines.MyspiderPipeline': 300,
'myspider.pipelines.MyspiderPipeline': 301,
}
#權重越小,他的運行的越快
2.保存數據
將數據從spiders中提取到pipelines中並進行保存
使用:yield
主要的功能是對下載的數據進行保存
class Dome1Pipeline(object):
def process_item(self, item, spider):
with open('test2.txt','a+',encoding='utf-8') as f:
data = json.dumps(dict(item),ensure_ascii=False) + '\n'
f.write(data)
return item
這裏一定要return item
告訴scrapy已經保存完了。
4.middlewares.py
pass
2.配置文件
1.設置提示信息
LOG_LEVEL = 'WARNING'
2.設置頭部信息
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36'
#或者
3.開啓管道
ITEM_PIPELINES = {
'myspider.pipelines.MyspiderPipeline': 300,
}
4.記錄到本地文件
LOG_FILE = './log.log'
5.logging的使用
級別 | 級別數值 | 使用時機 |
---|---|---|
DEBUG | 10 | 詳細信息,常用語調試 |
INFO | 20 | 程序正常運行中生產的一些信息 |
WARNING | 30 | 警告用戶,雖然程序正常運行,可能發生的錯誤 |
ERROR | 40 | 由於更嚴重的問題,程序不能執行的功能 |
CRITICAL | 50 | 嚴重錯誤,程序不能正常運行 |
6.方法
方法 | 作用 |
---|---|
logging.warning() | 雖然有警告用戶的信息,但是程序不報錯,繼續運行 |
這種方式可以記錄下日誌,但是不會指出那個文件報的錯
方法 | 作用 |
---|---|
logger = logging.getLogger(__ name __) | 將logger指定爲當前文件 |
logger.warning(data) | 將spider傳入的data打印出來 |