最近自學了Python中有關爬蟲的相關內容悯姊。同時吠架,看到網上有很多關于網頁抓取的文章锋喜,特別想實際操作一下。這篇文章是在借鑒[圖文詳解]scrapy安裝與真的快速上手----爬取豆瓣9分榜單的基礎上完成的棒搜。那么接下來就讓我們回到正題疹蛉,使用Scrapy進行爬取。
爬取的網址:豆瓣音樂Top250
爬取內容:
對爬取的內容進行解析:
打開網頁后按F12闺鲸,同時刷新剛打開的網頁,出現(xiàn)網頁解析器根據(jù)定位到的代碼可以書寫xpath或正則表達式
- 爬取的大范圍
'//div[@class="pl2"]' #//表示爬取標簽下所有內容
- 歌名
'a/text()'
- 歌手名游盲、發(fā)行時間误墓、曲風
'<p class="pl">(.*?)/' #因為這些信息連在一起多以可以考慮先集體爬取之后再用對信息進行分列
- 評分
'div[@class="star clearfix"]/span[@class="rating_nums"]/text()'
進行以上分析后我們現(xiàn)在正式進入Scrapy中進行編程
建立爬蟲項目和爬蟲文件
1.快捷鍵Ctrl+R打開cmd 通過cd命令定位到工作環(huán)境(后期的文件都保存在該路徑下)
2.建立爬蟲項目 在cmd中輸入scrapy startproject 爬蟲項目名 ,本文建立的爬蟲項目名為doubanmusic益缎。
scrapy startproject doubanmusic
3.建立爬蟲文件 在cmd中先定位到步驟2建立的爬蟲項目(例:cd doubanmusic),之后建立爬蟲文件 scrapy genspider -t basic 文件名 域名
(例:scrapy genspider -t basic main douban.com)
4.打開python編輯器谜慌,打開settings.py文件,使用快捷鍵Ctrl+F查找到USER_AGENT的位置
5.打開main.py先爬取第一頁的內容莺奔,進行測試
import scrapy
import re
class MainSpider(scrapy.Spider):
name = 'main'
allowed_domains = ['douban.com']
start_urls = ('https://music.douban.com/top250',) #start_urls需要具體定位到第一頁具體的網址欣范,注意后面有一個逗號
def parse(self, response):
selector = scrapy.Selector(response)
music = selector.xpath('//div[@class="pl2"]')
for each in music:
names = each.xpath('a/text()').extract()[0]
names = names.replace(' ','').replace('\n','')#為了使后面的輸出更友好,剛開始練習時可以不加這一條看看前后效果
grade = each.xpath('div[@class="star clearfix"]/span[@class="rating_nums"]/text()').extract()[0]
infor = each.xpath('p[@class="pl"]/text()').extract()[0]
print("歌曲名: "+names)
print("綜合信息 :"+infor)
print("曲風 "+music_style)
print("評分 :"+grade)
print("-----------------------------------------------------------")
6.打開cmd進行測試 輸入scrapy crawl 爬蟲文件名(例:scrapy crawl main)
代碼測試正常令哟,因此可以開啟多頁爬取并將爬取內容保存到csv文件中
7.打開items.py文件定義需要保存的字段
import scrapy
class DoubanmusicItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
names = scrapy.Field()
info = scrapy.Field()
grade = scrapy.Field()
8.再次打開main.py恼琼,編寫代碼
import scrapy
import re
from doubanmusic.items import DoubanmusicItem #新增內容
class MainSpider(scrapy.Spider):
name = 'main'
allowed_domains = ['douban.com']
start_urls = ('https://music.douban.com/top250',)
def parse(self, response):
item = DoubanmusicItem() #新增內容
selector = scrapy.Selector(response)
music = selector.xpath('//div[@class="pl2"]')
for each in music:
names = each.xpath('a/text()').extract()[0]
names = names.replace(' ','').replace('\n','')
grade = each.xpath('div[@class="star clearfix"]/span[@class="rating_nums"]/text()').extract()[0]
info = each.xpath('p[@class="pl"]/text()').extract()[0]
item['names'] = names
item['grade'] = grade
item['info'] = info
yield item #新增內容
#print("歌曲名: " + names)
#print("綜合信息: " + info)
#print("評分: " + grade)
#print("-----------------------------------------------------------")
next_page = selector.xpath('//span[@class="next"]/link/@href').extract()#以下均為新增內容
if next_page: #實現(xiàn)翻頁,直到最后一頁為止
next = next_page[0]
print(next)
yield scrapy.http.Request(next,callback=self.parse)
翻頁處的xpath來自下圖
8.打開settings.py屏富,創(chuàng)建數(shù)據(jù)爬取的保存的位置
9.在cmd中運行 scrapy crawl main 打開路徑下的doubanmusic 發(fā)現(xiàn)是亂碼晴竞。修正方法:可以右鍵選擇以記事本的形式打開,發(fā)現(xiàn)不是亂碼狠半。然后另存為csv格式(注意編碼為UTF-8)噩死。再次打開時沒有亂碼。
10.可以利用CSV中的分列功能將info字段中的內容在/處進行分隔已维。
ps:現(xiàn)在還是一個爬蟲小白,什么都在摸索和借鑒中已日,上文可能有很多不足之處垛耳,歡迎大家指正。