接上一篇。
然后是帮某个body抓淘宝的店铺评分数据,即5星的有多少人、多少比例,4星的多少人、多少比例,以此类推到1星的多少人多少比例,加上平均分和总的评分人数。
因为要的是数据而已,而且其实并不多,最后大概抓了1000+,加上有个同学说现在抓数据比较严格了,很多网站抓多了需要验证码,所以我只抓了平均分以及总人数和各星的比例,各星的人数就交给excel做了,或者在代码里乘法也可以,但是没试过。
首先安装scarapy。
我。。我不记得我是怎么装的了,去官网下了个,然后安装的时候貌似又有问题,因为我的mbp可能有些不一样,但,最后我装上去了。过程暂时忽略。。。
然后新建类似于工程的东西。
网上scarapy的资料似乎不多,帖子也就那么几篇,代码都是差不多的。
我也没有学过python,只能连蒙带猜的折腾了,最后能取到数据就好。
和其他的帖子一样,先是要定义items。
修改items.py。
# coding=utf-8
# Define here the models for your scraped items
#
# See documentation in:
# http://doc.scrapy.org/topics/items.html
from scrapy.item import Item, Field
class TaobaoItem(Item):
# define the fields for your item here like:
# name = Field()
name=Field()
count5=Field()
count4=Field()
count3=Field()
count2=Field()
count1=Field()
aveg=Field()
peo=Field()
第一行是后面出了点问题的时候加的,结果是其他问题,反正那个问题解决的时候全正常了这句就放在这儿了。
定义的名称就凑合看下吧。
然后是文件夹里面的xxx.py,就是你自己定义的爬虫。千万要记得这个要用个不一样点的名字!!!!!我之前就写了个taobao.py就不行,貌似因为我文件夹也叫taobao。这个问题困扰了我相当久。
# coding=utf-8
from urlparse import urljoin
from scrapy.http import Request
from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.selector import HtmlXPathSelector
from taobao.items import TaobaoItem
class TaobaoSpider(CrawlSpider):
name='taobaospider'
allowed_domains=['taobao.com']
start_urls=['http://xxxx='+str(x)+'xxxx='+str(y) for y in range (1,23) for x in range (1,8)]
rules=(
Rule(SgmlLinkExtractor(allow=(r'http://http://jie.taobao.com/')),callback='parse'),
Rule(SgmlLinkExtractor(allow=(r'http://rate.taobao.com/')),callback='parse_item'),
)
def parse(self,response):
hxs1=HtmlXPathSelector(response)
for z in range (1,15):
shop=hxs1.select('//xxx'+str(z)+'xxx/a/@href').extract()
if len(str(shop))>5:
yield Request(shop[0],callback=self.parse_item)
def parse_item(self,response):
hxs=HtmlXPathSelector(response)
sites=hxs.select('//xxx//xx')
item=TaobaoItem()
items=[]
item['name']=hxs.select('//xxx//xx/a/text()').extract()
item['aveg']=sites.select('xxx//xx//text()').extract()
item['count5']=sites.select('xx/text()').extract()
item['count4']=sites.select('xx/text()').extract()
item['count3']=sites.select('xx/text()').extract()
item['count2']=sites.select('xx/text()').extract()
item['count1']=sites.select('xxx/text()').extract()
item['peo']=sites.select('xx/text()').extract()
items.append(item)
return [item]
start_urls需要自己写下,我没把淘宝的贴上来,可以是一个也可以是一串,我用了一串,而且中间有变量x和y,因为很多页面是有规律的,如果只是一个静态链接那后面的xy都可以去掉,只需要一个网址即可。
因为数据用于演示,所以允许有误差,我就直接用了店铺街的数据,那里有按信用排名的页面。我需要的数据是每个大类前xxx名销量的店铺的评分信息。淘宝大部分还是好评的,所以用信用代替了销量。并且这个方法去除了天猫的。
下面的rules表示如果是店铺街的页面那就是需要获取页面源码中的店铺的评分页面的链接。如果已经是店铺评分页面则获取相应的平均分、总人数以及各星数据。
select里面//表示相对,/表示绝对,也就是说当前在xx了,如果是xx/yy那么yy就是在xx下面的,但//有可能是下面很多级。关于xpath有个极力推荐的就是chrome下有个插件,点击网页对应部分那个插件就可以显示对应的xpath,相当好用。如果是看源码chrome自带的开发者工具就很好用了。大爱chrome哈哈。
由于店铺街上有很多店铺,我用变量z来控制获取第几个,xpath里面也是有规律的,第几个店铺某一项编号就是多少。获取了链接就yield request然后获取想要的东西。
因为天猫在店铺街的显示和集市的不同,我就偷懒直接把天猫的去掉了,按集市的格式天猫的链接获取不到,如果再yield request就会出错,所以加了个长度判断,淘宝评分页面正确的网址长度一定是大于5的。
这个时候数据已经有了,下面需要输出。
在上一层文件夹的pipelines.py,就是和之前定义的item那个在同一级目录。
# 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/topics/item-pipeline.html
class TaobaoPipeline(object):
def __init__(self):
self.file=open('tabao.xml','w')
def process_item(self, item, spider):
self.file.write(str(item['name'][0].encode("utf-8"))+'\t'+str(item['aveg'][0])+'\t'+str(item['peo'][0])+'\t'+str(item['count5'][0])+'\t'+str(item['count4'][0])+'\t'+str(item['count3'][0])+'\t'+str(item['count2'][0])+'\t'+str(item['count1'][0])+'\n')
return item
我直接写到xml里面了,也可以写到数据库。
这里千万千万注意time是list不是直接就是字符串!!!!我就在这里各种纠结,还以为是编码的问题,数据对了文字总是乱码!!搞了半天才发现需要取出第一项也是唯一那项。
这样是可以显示中文英文数字都正常的。
然后用excel打开xml,该乘法的乘法,该怎么滴就怎么滴。
至此,scrapy的也说完了。。。
后面就是和cs无关的东东了。肿么烤饼干肿么烤蛋糕的还是不记录了。。
接下来据说要做测速和车标识别,虽然我很懒。或者又需要帮某个body折腾下某个东西。