最近自学了Python中有关爬虫的相关内容。同时,看到网上有很多关于网页抓取的文章,特别想实际操作一下。这篇文章是在借鉴[图文详解]scrapy安装与真的快速上手----爬取豆瓣9分榜单的基础上完成的。那么接下来就让我们回到正题,使用Scrapy进行爬取。
爬取的网址:豆瓣音乐Top250
爬取内容: 爬取内容:歌名、歌手名、发行日期、曲风、评分
对爬取的内容进行解析:
打开网页后按F12,同时刷新刚打开的网页,出现网页解析器 点击右上图的小指针后点击网页上内容在解析器中显示对应的代码位置;另外点击任意如下方的链接会得到User_Agent的信息该步骤得到的信息对后续爬取有用(一般该信息只需要获取一次,下次可以重复使用)
按照图中步骤定位到单条信息爬取的整体区域
展开上图中定位到的代码,并对位到需要获取信息是位置
根据定位到的代码可以书写xpath或正则表达式
- 爬取的大范围
'//div[@class="pl2"]' #//表示爬取标签下所有内容
- 歌名
'a/text()'
- 歌手名、发行时间、曲风
'<p class="pl">(.*?)/' #因为这些信息连在一起多以可以考虑先集体爬取之后再用对信息进行分列
- 评分
'div[@class="star clearfix"]/span[@class="rating_nums"]/text()'
进行以上分析后我们现在正式进入Scrapy中进行编程
建立爬虫项目和爬虫文件
1.快捷键Ctrl+R打开cmd 通过cd命令定位到工作环境(后期的文件都保存在该路径下)
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的位置
引号内的内容为之前定位到的use_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: #实现翻页,直到最后一页为止
next = next_page[0]
print(next)
yield scrapy.http.Request(next,callback=self.parse)
翻页处的xpath来自下图
定位xpath
8.打开settings.py,创建数据爬取的保存的位置
u'file:///E://doubanmusic.csv(具体路径可以自行设置)
9.在cmd中运行 scrapy crawl main 打开路径下的doubanmusic 发现是乱码。修正方法:可以右键选择以记事本的形式打开,发现不是乱码。然后另存为csv格式(注意编码为UTF-8)。再次打开时没有乱码。 注意文件名后加.csv,编码选择UTF-8
10.可以利用CSV中的分列功能将info字段中的内容在/处进行分隔。
ps:现在还是一个爬虫小白,什么都在摸索和借鉴中,上文可能有很多不足之处,欢迎大家指正。
网友评论