【Scrapy學習心得】爬蟲實戰一(入門案例)
聲明:僅供技術交流,請勿用於非法用途,如有其它非法用途造成損失,和本博客無關
爬取的網站:東莞陽光網問政平臺中的投訴頁面 點擊跳轉
一、配置環境
python3.7
pycharm
Scrapy1.7.3
win10
pymysql
二、準備工作
- 在cmd命令行中進入需要創建項目的目錄運行
scrapy startproject tutorial
- 創建成功後繼續執行
cd yg
- 然後執行
scrapy genspider yg sun0769.com
- 最後在spider文件夾下可以看到剛創建的
yg.py
爬蟲文件
三、分析網頁
可以看到,這是一個很簡單的網頁而已,非常容易爬取數據,在這個頁面我只想要它的標題以及標題對應詳情頁面的url
和時間,然後隨便進入其中一個標題內容的詳情頁面,如下:
然後這個詳情頁面我只想要它的文本內容,即提問的這個人所寫的具體信息。不過可以發現有一些會有上傳圖片,例如:
那麼我也想把它的圖片拿下來,這裏我只把圖片的url
爬取下來了
所以總共我要爬取的內容有:
- 一開始的頁面裏的標題
- 標題詳情頁面的
url
地址 - 時間
- 詳情頁面裏的圖片
url
地址 - 詳情頁面裏的內容
在此,我們在yg
項目目錄下的item.py
文件裏可以先定義如下:
import scrapy
class TutorialItem(scrapy.Item):
title = scrapy.Field() #標題
url = scrapy.Field() #標題詳情頁面url
date = scrapy.Field() #時間
img_url = scrapy.Field() #圖片url
content = scrapy.Field() #內容
可以說item.py
文件在scrpy框架爬蟲中是最簡單好寫的一個,沒有之一,並且我感覺它是可有可無的,因爲你可以在爬蟲文件中自己定義一個item變量字典用來保存爬取的數據,都是一樣的結果,只是用item.py
會顯的更加裝13專業一點,哈哈
查找元素的那些操作我就不放上來了,因爲沒什麼難度的,會來學scrapy
框架的同學肯定是跟我一樣那些什麼requests
啊,urllib
啊,selenium
啊等等都是用膩了纔來的,是吧
四、爬取數據
下面直接放上yg.py
的代碼:
# -*- coding: utf-8 -*-
import scrapy
from tutorial.items import TutorialItem #需要導入item文件中的創建的類
class YgSpider(scrapy.Spider):
name = 'yg'
allowed_domains = ['sun0769.com']
start_urls = ['http://d.wz.sun0769.com/index.php/question/questionType?type=4']
def parse(self, response):
tr_list=response.xpath('//div[@class="greyframe"]/table[2]/tr/td/table/tr')
for tr in tr_list:
item=TutorialItem()
item['title']=tr.css('a::attr(title)').get()
item['url']=tr.css('a::attr(href)')[1].get()
item['date']=tr.xpath('./td[last()]/text()').get()
#下面是發送去詳情頁面的請求
yield scrapy.Request(
item['url'],
callback=self.parse_detail, #讓返回的response交給這個函數處理,注意:不要帶上括號
meta={'item':item} #並且把上面爬到的標題等內容一起傳過去
)
#下面是進行翻頁的操作
next_page=response.xpath('//a[text()=">"]/@href').get()
if next_page is not None:
yield scrapy.Request(next_page,callback=self.parse)
def parse_detail(self,response):
item=response.meta['item'] #接受傳進來的item
item['content']=response.xpath('//td[@class="txt16_3"]/text()').getall()
item['img_url']=response.xpath('//td[@class="txt16_3"]//img/@src').getall()
#下面處理圖片url
item['img_url']=['http://wz.sun0769.com' + i for i in item['img_url']]
item['img_url']=''.join(i for i in item['img_url'])
yield item #會傳給pipeline.py進行保存數據的操作
五、保存數據
保存數據是交給pipeline.py
文件進行操作的
這裏我把數據保存到了mysql
數據庫中,如果沒有安裝pymysql
的,可以在cmd命令下執行pip install pymysql
來安裝一下即可
然後pipeline.py
文件的代碼如下:
# -*- coding: utf-8 -*-
import pymysql
class TutorialPipeline(object):
#爬蟲開始時運行的函數
def open_spider(self,spider):
print('爬蟲開始...')
conn = pymysql.connect(host='localhost', user='youruser', password='yourpassword', database='yourdatabase', charset='utf8')
cursor = conn.cursor()
#接收傳入的item,來進行數據的存儲
def process_item(self, item, spider):
if spider.name == 'yg':
item['content']=self.process_content(item['content'])
title=item['title']
url=item['url']
date=item['date']
content=item['content']
img_url=item['img_url']
sql='insert into yg(title,url,date,content,img_url) values(%s,%s,%s,%s,%s)'
cursor.execute(sql, [title,url,date,content,img_url])
conn.commit()
#因爲傳進來的content需要清洗處理一下,因此定義下面的函數
def process_content(self,content):
content=[re.sub(r"\xa0|\s","",i) for i in content]
content=[i for i in content if len(i)>0]
content=[i.strip() for i in content]
content=''.join(i for i in content)
# content=''.join(content).strip()
return content
#爬蟲結束後會運行的函數
def close_spider(self,spider):
print('爬蟲結束...')
cursor.close()
conn.close()
現在我們的爬蟲大致已經是寫完了,不過我還要修改一下setting.py
文件的一些設置,需要增加的語句有:
LOG_LEVEL='WARNING' #設置日誌輸出級別
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36' #設置請求頭
ROBOTSTXT_OBEY = False #把這個設置成False,就不會去請求網頁的robots.txt,因爲不改爲False的話,scrapy就會去訪問該網站的robots.txt協議,如果網站沒有這個協議,那麼它就不會去訪問該網站,就會跳過,進而爬不到數據
ITEM_PIPELINES = {
'tutorial.pipelines.TutorialPipeline': 300, #打開剛剛設置的pipeline.py
}
最後在cmd中先進入到這個項目的根目錄下,即有scrapy.cfg
文件的目錄下,然後輸入並運行scrapy crawl yg
,最後靜靜等待就行了
打開數據庫你會看到:
寫在最後
到現在爲止,我接觸python
爬蟲也差不多有半年了吧,不是接觸,是開始學,因爲之前都沒有爬取過數據,都在做數據分析的工作。然後呢,一開始我就從圖書館借了幾本python
爬蟲的書來看,都是一些比較基礎的入門級別的書,當時還有課,只是在空閒的時間裏學,偶爾在一些比較無聊的課的時候會帶過去看,也不知道爲什麼,看着看着就覺得很有趣,就會去敲敲代碼自己爬一下玩玩,爬着爬着就好像懂得了一些爬蟲的原理吧,於是趁着放暑假,就從圖書館又借了幾本發佈時間不久的比較新的系統一點的書,回到家就把那幾本書給看完了,並且是一個案例都不放過的那種,從一開始的urllib
到requests
,再到selenium
,全部都學完了,也不是學完吧,就大致都知道怎麼用,也可以很好的結合在一起使用,現在是運用自如。最近呢,想了想,好像還差點什麼東西,是什麼呢,毫無疑問就是框架啊,到現在我一個爬蟲的框架都沒有學過,於是就開始學非常非常熱門的scrapy
了,也學了有一段時間了,沒算錯的話應該有3個星期了。然後呢,學到現在,大概是知道了scrapy
的一些原理,以及怎麼使用它了,也知道了它的一些優點和缺點。又因爲最近時間有點兒充裕,而且朋友也問我爲什麼不寫寫博客之類的啊,記錄一下也好啊。於是乎,就有了這一篇文章。後續我會繼續寫scrapy
的一些爬蟲案例,並且記錄一下當下的一些心得體會,與大家分享一下。