用Scrapy爬取当当网书籍信息
日期:2019-04-23 23:27:34 星期二
项目流程
- 确定项目目标
- 创建Scrapy项目
- 定义Item(数据)
- 创建和编写Spider文件
- 修改Settings.py文件
- 运行Scrapy爬虫
确定项目目标
今天通过创建一个爬取当当网2018年图书销售榜单的项目来认识一下Scrapy的工作流程
当当链接: "http://bang.dangdang.com/books/bestsellers/01.54.00.00.00.00-year-2018-0-1-1 "
目标:
- 爬取前3页的数据
- 爬取字段:图书名、作者和价格
创建Scrapy项目
首先要安装scrapy这个库,但这个安装很麻烦,很容易掉坑
我这里是用anaconda下载的,这种方式很方便
下载命令:pip install scrapy
用cmd命令打开命令行窗口,输入以下命令:
scrapy startproject dangdang
dangdang是项目的名称
到这里就创建好了我们的dangdang项目
定义Item数据
打开items.py文件,并添加以下内容:
代码语言:javascript
复制
import scrapy
class DangdangItem(scrapy.Item): #继承scrapy.Item类
name = scrapy.Field() #定义数据属性
author = scrapy.Field()
price = scrapy.Field()
创建和编写Spider文件
在spiders文件夹里面新建一个spider.py(自己命名的),编写爬去代码。 代码如下:
代码语言:javascript
复制
import scrapy from bs4 import BeautifulSoup from ..items import DangdangItem #..代表上层目录,因为现在spider文件夹,item在上层目录,然后导入DangdangItem模块 class DangdangSpider(scrapy.Spider): #括号里需要有scrapy.Spider这个基类,这个基类里面包含很多属性和方法供我们使用 name = "dangdang" #项目名字,待会运行爬虫时要用到 allow_domains = ["http://bang.dangdang.com"] #允许爬取的域名,可以准确定位,防止跳到其它广告 start_urls = [] for num in range(1,4): #获取前三页的链接 url = f"http://bang.dangdang.com/books/bestsellers/01.54.00.00.00.00-year-2018-0-1-{num}" start_urls.append(url)
def parse(self,reponse): #解析并提取数据的函数 soup = BeautifulSoup(reponse.text,"html.parser") tag_ul = soup.find("ul",class_="bang_list clearfix bang_list_mode") tags_li = tag_ul.find_all("li") for tag in tags_li: item = DangdangItem() #创建一个item对象,用来处理和传输数据 item["name"] =tag.find("div",class_="name").find("a").text item["author"]=tag.find("div",class_="publisher_info").find("a").text item["price"] = tag.find("span",class_="price_n").text print(item["name"]) print("="*40) yield item
**修改Settings.py文件 **
爬虫已经写好后还需要去settings.py文件里面修改一些内容
代码语言:javascript
复制
USER_AGENT = 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36' #伪装爬虫
ROBOTSTXT_OBEY = False
#有些网站的robots.txt规定是不允许爬取的,设置为True,scrapy就可以无视这个规定
运行Scrapy文件
用cmd打开命令窗口,输入以下命令即可开始运行程序
scrapy crawl dangdang
本文还没有对数据进行存储,如果需要如何存储数据,可以加我私聊