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&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了。运行结果如下:
是不是感觉离数据分析又近了一步喃。
- Scrapy爬取当当网的商品信息存到MySQL数据库
- Scrapy爬取亚马逊商品信息
- 【开源】scrapy爬取亚马逊商品信息
- 利用Scrapy框架爬取博客信息并存到mysql数据库
- python +selenium 爬取淘宝网商品信息
- Scrapy爬取网页并保存到数据库中
- 实战 使用scrapy 爬取代理 并保存到数据库
- scrapy爬取豆瓣电影top250并存储到mysql
- python,scrapy爬虫sql之爬取数据存储到mysql的piplelines.py配置
- Python爬虫系列之----Scrapy(八)爬取豆瓣读书某个tag下的所有书籍并保存到Mysql数据库中去
- 爬取当当网图书图片
- 爬取当当网图书信息
- Python爬取当当网亚马逊书名
- 比价网站的基础-爬取淘宝的商品信息
- 利用scrapy框架爬取互动百科的词条--存成json
- Python爬虫 爬取Google Play 100万个App的数据,并入库到数据库 scrapy框架
- 笔记:scrapy爬取的数据存入MySQL,MongoDB
- scrapy 将item存到mysql中(pymysql)
- pl查询
- 一元一次方程
- 剑指offer题解C++【5】用两个栈实现队列
- ServletContextListener的作用
- Postman工具——Pre-Request Script、Tests
- Scrapy爬取当当网的商品信息存到MySQL数据库
- apt-get update与apt-get upgrade区别
- nodejs-004JSMath函数/数组/表/字符串/常用接口
- 解决ubuntu+win10双系统循环进入启动界面导致无法启动win10的问题
- LeetCode
- 黑色帽子
- nginx(日志管理之日志的使用、定时任务完成日志切割)
- cordova build app提示找不到javac
- ionic3+angular4中给DOM添加监听事件后报错:Uncaught (in promise): TypeError: Cannot read property 'addEventListen