在豆瓣图书爬取书籍信息为例(爬取下面划红线的信息)
1.先创建一个mySpider项目(如何创建项目上面已经说过了)
2.打开mySpider目录下的items.py
Item 定义结构化数据字段,用来保存爬取到的数据(因为要爬取的是两行信息,下面定义两个变量来存取字符串)
# -*- coding: utf-8 -*-
# Define here the models for your scraped items
#
# See documentation in:
# https://doc.scrapy.org/en/latest/topics/items.html
import scrapy
class MyspiderItem(scrapy.Item):
brief = scrapy.Field()
quote = scrapy.Field()
2.在Terminal终端创建爬虫
3.重写myspider.py
# -*- coding: utf-8 -*-
import scrapy
from mySpider.items import MyspiderItem
# 创建一个爬虫类
class MyspiderSpider(scrapy.Spider):
# 爬虫名
name = 'myspider'
# 允许爬虫作用的范围(只能在你输入的这个网址爬取信息)
allowed_domains = ['https://market.douban.com/']
# 爬虫起始url
start_urls = ['https://market.douban.com/book/?utm_campaign=book_freyr_section&utm_source=douban&utm_medium=pc_web&page=1&page_num=18&']
def parse(self, response):
# with open('book.html', 'w') as f:
# f.write(response.body)
# 通过scrapy自带的xpath匹配出所有书的根节点
book_list = response.xpath('//div[@class="book-brief"]')
bookItem = []
# 遍历根节点集合 xpath返回的一定是列表
for each in book_list:
item = MyspiderItem()
# extract() 将匹配出来的结果转换为Unicode字符串
# 无extract() 结果为xpath匹配对象
brief = each.xpath('./h3/text()').extract()
quote = each.xpath('./div[@class="book-quote"]/p/text()').extract()
item['brief'] = brief[0]
item['quote'] = quote[0]
# print(brief[0])
# print(quote[0])
bookItem.append(item)
return bookItem
name = ""
:爬虫的识别名称,必须是唯一的,在不同的爬虫必须定义不同的名字。allow_domains = []
是搜索的域名范围,也就是爬虫的约束区域,规定爬虫只爬取这个域名下的网页,不存在的URL会被忽略。start_urls = ()
:爬取的URL元组/列表。爬虫从这里开始抓取数据,所以,第一次下载的数据将会从这些urls开始。其他子URL将会从这些起始URL中继承性生成。parse(self, response)
:解析的方法,每个初始URL完成下载后将被调用,调用的时候传入从每一个URL传回的Response对象来作为唯一参数,主要作用如下:
- 负责解析返回的网页数据(response.body),提取结构化数据(生成item)
- 生成需要下一页的URL请求。
4.在终端输入
scrapy crawl myspider -o book.json (爬取结果以json文件形式输出)
scrapy crawl myspider -o book.csv (爬取结果以excel文件形式输出)
文件输出可能出现乱码情况,就要修改上面代码的编码情况
5.进去http://www.bejson.com/可以查看json文件输出内容
爬取成功
代码过程中主要的问题一是不能手动创建scrapy文件,必须使用终端,二是输出结果有时是乱码
我这次爬取的主要是一页的内容,还不会爬取多页的情况,继续学习。