Scrapy爬取当当网的商品信息存到MySQL数据库

来源:互联网 发布:东北歌手最火的网络歌 编辑:程序博客网 时间:2024/06/06 17:12

Scrapy爬取当当网的商品信息存到MySQL数据库

Scrapy 是一款十分强大的爬虫框架,能够快速简单地爬取网页,存到你想要的位置。经过两天的摸索,终于搞定了一个小任务,将当当网的商品信息爬下来存到MySQL数据库里。

一、所需装备

1.python2.7

这个不用多说。。

2.MySQL

百度一下就知道了,我当初折腾了好久才弄懂怎么安装,怎么创建数据库,学一些简单的命令就Ok。

3.Scrapy

说实话,Scrapy的安装配置真的是要人命,不过这里分享一个万金油的方法。通过下面的链接http://pan.baidu.com/s/1pLgySav下载Anaconda,安装好了之后命令行输入:conda install scrapy就ok了。不过这里要提醒一下,这个方法可能没有安好pywin32。我当初就是没有安好,代码写好之后调试折腾了半天。如果pywin32没有安好的话,解决办法也很简单,在命令行输入:pip install pypiwin32就搞定了(默认已经安装好了pip哈,要是没有安好的话自行百度)

二、创建工程

Scrapy默认是不能在IDE中调试的(不过还是有解决方法的),所以工程的创建和调试要在命令行中进行。
创建方式是命令行进入你想创建的位置,然后输入:scrapy startproject balabala
balabala为项目名称哈)。
我在E盘下创建的项目为dangdang, 如图:
这里写图片描述
然后发现E盘根目录下多了一个dangdang文件,点进去就有如下的文件:
这里写图片描述
_init_文件是项目初始化文件。
items 文件是我们用来定义数据类型的文件。比如我们想爬取商品名,价格,商品链接,商品评论数,就可以定义name, price, link, commet等数据类型。
middlewares 是下载中间件,在本项目中可以不管。
pipelines 是爬虫项目的管道文件,用来对数据进行加工处理,比如我们保存到数据库就是在这里边进行的。
settings 是爬虫项目的设置文件,我们一般用来设置Cookie, Item_pipelines, 等等,默认情况下是注释掉的,需要人为根据项目需要来修改。

然后通过Genspider命令来创建我们项目自己定义的文件。可以通过scrapy genspider -l
来查看当前可使用的模板:
这里写图片描述
我们就用

scrapy genspider -t basic mydangdang dangdang.com

命令行来创建一个使用了basic模板的mydangdang爬虫文件,爬虫爬取的域名是dangdang.com。然后就会发现spider文件目录下多了一个mydangdang文件。

三、修改代码

1.items文件

<python># -*- coding: utf-8 -*-# Define here the models for your scraped items## See documentation in:# http://doc.scrapy.org/en/latest/topics/items.htmlimport scrapyclass DangdangItem(scrapy.Item):    # define the fields for your item here like:    # name = scrapy.Field()    name = scrapy.Field()    price = scrapy.Field()    link  = scrapy.Field()    commet = scrapy.Field()

定义要爬取的商品名,价格,链接,评论数。

2.spider目录下的mydangdang文件

<python># -*- coding: utf-8 -*-import scrapyfrom dangdang.items import DangdangItemclass mydangdangSpider(scrapy.Spider):    name = "mydangdang"    allowed_domains = ["dangdang.com"]    start_urls = ['http://category.dangdang.com/cid4002203.html']    def parse(self, response):        item = DangdangItem()        item["name"] = response.xpath("//a[@name='itemlist-title']/@title").extract()        item["price"] = response.xpath("//span[@class='price_n']/text()").extract()        item["link"] = response.xpath("//a[@name='itemlist-title']/@href").extract()        item["commet"] = response.xpath("//a[@name='itemlist-review']/text()").extract()        #print(item["name"])        #print(item["price"])        #print(item["link"])        #print(item["commet"])        yield item

其中用到了Xpath表达式,之前我还在傻傻的用re正则表达式,那个很痛苦呀,少了一个小空格,一个小点都不能玩。自从接触到了Xpath我就深深地爱上了它。
比如我想爬取商品名,如下图:
这里写图片描述
按F12分析源码:

<a title=" 包邮 RICH/莱彩 HD-913 数码摄像机 摄影机 1080P 高清 暂停 家用 DV录像机 照相机  2400万像素 触控屏 时间显示 " href="http://product.dangdang.com/1075438006.html" name="itemlist-title" dd_name="单品标题" ddclick="act=normalResult_title&amp;pos=1075438006_0_1_m" target="_blank"> 包邮 RICH/莱彩 HD-913 数码摄像机 摄影机 1080P 高清 暂停 家用 DV录像机 照相机  2400万像素 触控屏 时间显示 </a>

对应的Xpath 语句就是

item["name"] = response.xpath("//a[@name='itemlist-title']/@title").extract()

//表示获取所有的满足该标签的信息。
a对应源码中的a属性。
@name = ‘itemlist-title’表示name属性为itemlist-title的代码段。
/@title表示找到属性为title对应的值。

最后返回item

3. settings文件的修改

找到ITEM_PIPELINES这一行,做如下修改:

ITEM_PIPELINES = {   'dangdang.pipelines.DangdangPipeline': 300,}

找到COOKIES_ENABLED这一行,做如下修改:

COOKIES_ENABLED = False

这个修改是因为有的网站通过cookies来反爬虫,我们把它设置为False就可以避免爬虫失败。
此外还可以将ROBOTSTXT_OBEY 设置为False,这样就不用遵守爬虫协议。

4. pipelines文件

pipelines文件是关键,它是用来处理返回的item,并将它保存到数据库。

<python># -*- coding: utf-8 -*-# Define your item pipelines here## Don't forget to add your pipeline to the ITEM_PIPELINES setting# See: http://doc.scrapy.org/en/latest/topics/item-pipeline.htmlimport MySQLdbdef dbHandle():    conn = MySQLdb.connect('localhost', '用户名', '自己的密码', '数据库名',charset='utf8')    return connclass DangdangPipeline(object):    def process_item(self, item, spider):        dbObject = dbHandle()        cursor = dbObject.cursor()        sql ='insert into dangdang(id,name,price,link,commet) values(%s,%s,%s,%s,%s)'        for j in range(len(item["name"])):            try:                cursor.execute(sql,(j+1,item["name"][j],item["price"][j],item["link"][j],item["commet"][j]))                dbObject.commit()            except Exception ,e:                print(e)                dbObject.rollback()        return item

在这里我已经在MySQL里设置好了数据表,具体设置方法可以百度,最简单的方法是在MySQL可视化软件里设置就OK了。

5. 运行爬虫

我写的爬虫只是个小测试,只爬取第一页,如果想爬取更多的数据可以设置循环自动爬取多少页。本来爬虫就不是个什么好事,所以建议没有特别的需要就不要给服务器增加额外的负担了。
运行爬虫也很简单,命令行输入:

scrapy crawl mydangdang

就OK了。运行结果如下:
这里写图片描述

是不是感觉离数据分析又近了一步喃。

阅读全文
5 0