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

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.html

import scrapy


class 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 scrapy
from dangdang.items import DangdangItem

class 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.html

import MySQLdb

def dbHandle():
    conn = MySQLdb.connect('localhost', '用户名', '自己的密码', '数据库名',charset='utf8')
    return conn

class 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了。运行结果如下:
这里写图片描述

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

  • 7
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
好的,我可以给你提供一个简单的Scrapy爬取当当网的示例代码。 首先,需要在终端或命令行中安装Scrapy:`pip install scrapy` 然后,可以创建一个新的Scrapy项目:`scrapy startproject dangdang` 在项目的根目录下,打开`settings.py`文件,并添加如下内容: ``` ROBOTSTXT_OBEY = False DOWNLOAD_DELAY = 2 USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36' ``` 这里的作用是告诉Scrapy不要遵守Robots协议,设置下载延迟为2秒,以及设置用户代理。 接下来,在项目的根目录下,创建一个新的Spider:`scrapy genspider dangdang_spider dangdang.com` 打开`dangdang_spider.py`文件,并添加如下内容: ``` import scrapy class DangdangSpider(scrapy.Spider): name = "dangdang" allowed_domains = ["dangdang.com"] start_urls = ["http://category.dangdang.com/cp01.00.00.00.00.00.html"] def parse(self, response): for sel in response.xpath('//ul[@class="bigimg"]/li'): item = {} item['title'] = sel.xpath('a/@title').extract()[0] item['link'] = sel.xpath('a/@href').extract()[0] item['price'] = sel.xpath('p[@class="price"]/span[@class="search_now_price"]/text()').extract()[0] yield item ``` 这里的作用是定义一个Spider,设置起始url为当当网首页,解析响应并提取商品的标题、链接和价格信息。 最后,在终端或命令行中执行如下命令即可启动爬虫并将结果保存到一个JSON文件中:`scrapy crawl dangdang -o dangdang.json` 这是一个简单的示例代码,你可以根据自己的需要进行更改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值