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&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了。运行结果如下:
是不是感觉离数据分析又近了一步喃。