Scrapy爬虫笔记【8-Scrapy核心操作+爬豆瓣图片+数据库链接】

转博客地址【http://blog.csdn.net/xiantian7

scrapy shell urlLink

及时工程中不添加任何代码,命令行也可以这么使用,这是用来模拟爬取的效果

出现结果

当然,测试爬取的效果,就是针对response 和sel两个结果来做处理,主要是sel,在sel的基础上使用xpath等过滤方法。基本的xpath用法前面介绍过

现在强调及几个重要的用法

1.sel是一个selector

2. sel.xpath(),之后得到的是一个selectorList,就是一堆的selector,这样就可以更快的获取我们需要的数据(使用sel.select()是一样的效果)

3、要取出节点下面的文本数据,需要使用sel.xpath().extract() 方法 或者 sel.select().extract()

hxs.select(‘//ul/li/div/a/@href’).extract()

选取了xpath中herf元素中的内容,<a href=”被选取的内容”><img src=”link”></img></a>

当然如果要选取link,应该这么写 hxs.select(‘//ul/li/div/a/img/@src’).extract()

这么写可以得到图片的地址sel.select(“//ul/li/div[@class=’cover’]/a/@href”).extract()

而且对比一下就会发现,如果缩略图的URL是:

http://img3.douban.com/view/photo/thumb/public/p2151696782.jpg

那么这个图片的URL就是

http://img3.douban.com/view/photo/photo/public/p2151696782.jpg

然后我们点击图片左下角的查看原图,就会发现,图片的链接是:

http://img3.douban.com/view/photo/raw/public/p2151696782.jpg

这样只要简单的做一下字符串替换,就可以得到原图的link了

那么得到的spider文件应该是这样的

  1. from scrapy.spider import BaseSpider
  2. from scrapy.selector import HtmlXPathSelector
  3. class DouBanImage(BaseSpider):
  4.    name = “douban”
  5.    allowed_domains = [“douban.com”]
  6.    filename = ‘douban.txt’
  7.    f = open(filename, ‘wb’)
  8.    start_urls = [“http://movie.douban.com/subject/10581289/photos?type=S”]
  9.    def parse(self, response):
  10.        hxs = HtmlXPathSelector(response)
  11.        sites = hxs.select(‘//ul/li/div/a/img/@src’).extract()
  12.        for site in sites:
  13.            site = site.replace(‘thumb’,’raw’)
  14.            self.f.write(site)
  15.            self.f.write(‘\r\n’)

我们把链接地址全部就写入一个文件

 

观察每一页的地址,可以发现。。。。很有规律性的。。。start=0,40,80,120…于是乎,一个简单无比的代码就出来了

某一个页面分析完,不一定像我这种只想要图片地址的,比如说可能有人还想要每张图片的评论,所以呢,就有了Item这个文件,对于编辑items.py这个文件,每添加一个项,就是用XXX=Filed()就可以了。

 

  1. from scrapy.item import Item, Field
  2. class DoubanimageItem(Item):
  3.     # define the fields for your item here like:
  4.     # name = Field()
  5.     ImageAddress = Field()
  6.     pass

最终的spider文件

 

  1. from scrapy.spider import BaseSpider
  2. from scrapy.selector import HtmlXPathSelector
  3. from doubanImage.items import DoubanimageItem
  4. import urllib
  5. class DouBanImage(BaseSpider):
  6.     name = “douban”
  7.     allowed_domains = [“douban.com”]
  8.     start_urls = [];
  9.     f = open(‘douban.txt’, ‘w’)
  10.     for i in range(0,1560,40):
  11.         start_urls.append(‘http://movie.douban.com/subject/10581289/photos?type=S&start=%d&sortby=vote&size=a&subtype=a’%i)
  12.     def parse(self, response):
  13.         hxs = HtmlXPathSelector(response)
  14.         sites = hxs.select(‘//ul/li/div/a/img/@src’).extract()
  15.         items = []
  16.         self.f = open(‘douban.txt’, ‘a’)
  17.         counter=0
  18.         for site in sites:
  19.             site = site.replace(‘thumb’,’raw’)
  20.             self.f.write(site)
  21.             self.f.write(‘\r\n’)
  22.             item = DoubanimageItem()
  23.             item[‘ImageAddress’] = site
  24.             items.append(item)
  25.             urllib.urlretrieve(site,str(counter)+’.jpg’)
  26.             print’————————————————————–‘
  27.             print ‘*****************picture ‘+str(counter)+”  is already downloaded************”
  28.             counter=counter+1;
  29.         self.f.close()
  30.         return items

 

上面的item的内容是:

 

reference link: 点我

 

数据库链接

先贴代码:

1、工程firstScrapy      item文件 

 

  1. from scrapy.item import Item, Field
  2. class FirstscrapyItem(Item):
  3.     title = Field(serializer=str)
  4.     link = Field(serializer=str)

2、spider文件

 

 

  1. #coding=utf-8
  2. __author__ = ‘chenguolin’
  3. “””
  4. Date: 2014-03-06
  5. “””
  6. from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
  7. from scrapy.contrib.spiders import CrawlSpider, Rule        #这个是预定义的蜘蛛,使用它可以自定义爬取链接的规则rule
  8. from scrapy.selector import HtmlXPathSelector               #导入HtmlXPathSelector进行解析
  9. from firstScrapy.items import FirstscrapyItem
  10. f=open(‘log.txt’,’a’)
  11. class firstScrapy(CrawlSpider):
  12.     name = “firstScrapy”                                    #爬虫的名字要唯一
  13.     allowed_domains = [“yuedu.baidu.com”]                   #运行爬取的网页
  14.     #start_urls = [“http://yuedu.baidu.com/book/list/0?od=0&show=1&pn=0”]   #第一个爬取的网页
  15.     start_urls = [“http://yuedu.baidu.com/book/list/0?od=0&show=1”]
  16.     #以下定义了两个规则,第一个是当前要解析的网页,回调函数是myparse;第二个则是抓取到下一页链接的时候,不需要回调直接跳转
  17.     rules = [Rule(SgmlLinkExtractor(allow=(‘/ebook/[^/]+fr=booklist’)), callback=’myparse’),
  18.              Rule(SgmlLinkExtractor(allow=(‘/book/list/[^/]+pn=[^/]+’, )), follow=True)]
  19.     #回调函数
  20.     def myparse(self, response):
  21.         x = HtmlXPathSelector(response)
  22.         item = FirstscrapyItem()
  23.         # get item
  24.         item[‘link’] = response.url
  25.         item[‘title’] = “”
  26.         f.write(str(item[‘link’]+’\r\n’))
  27.         strlist = x.select(“//h1/@title”).extract()
  28.         if len(strlist) > 0:
  29.             item[‘title’] = strlist[0]
  30.         # return the item
  31.         return item
  32. <strong>
  33. </strong>

3、pipelines文件

 

 

  1. #coding=utf-8
  2. # Define your item pipelines here
  3. #
  4. # Don’t forget to add your pipeline to the ITEM_PIPELINES setting
  5. # See: http://doc.scrapy.org/en/latest/topics/item-pipeline.html
  6. from twisted.enterprise import adbapi              #导入twisted的包
  7. import MySQLdb
  8. import MySQLdb.cursors
  9. class FirstscrapyPipeline(object):
  10.     def __init__(self):                            #初始化连接mysql的数据库相关信息
  11.         self.dbpool = adbapi.ConnectionPool(
  12.                 dbapiName=’MySQLdb’,
  13.                 host=’127.0.0.1′,
  14.                 db = ‘表名’,
  15.                 user = ‘root’,
  16.                 passwd = ‘密码’,
  17.                 cursorclass = MySQLdb.cursors.DictCursor,
  18.                 charset = ‘utf8’,
  19.                 use_unicode = False
  20.         )
  21.     # pipeline dafault function                    #这个函数是pipeline默认调用的函数
  22.     def process_item(self, item, spider):
  23.         query = self.dbpool.runInteraction(self._conditional_insert, item)
  24.         return item
  25.     # insert the data to databases                 #把数据插入到数据库中
  26.     def _conditional_insert(self, tx, item):
  27.         p=open(‘yeah.txt’,’a’)
  28.         p.write(str(item[“link”]))
  29.         sql = “insert into book values (%s, %s)”
  30.         tx.execute(sql,(item[“title”][0:], item[“link”][0:]))

4、setting文件

  1. BOT_NAME = ‘firstScrapy’
  2. SPIDER_MODULES = [‘firstScrapy.spiders’]
  3. NEWSPIDER_MODULE = ‘firstScrapy.spiders’
  4. ITEM_PIPELINES = [
  5.     ‘firstScrapy.pipelines.FirstscrapyPipeline’
  6. ]

再贴图

 

存储数据库的结果

系统流程图

最后的数据库可以是其他数据库,我们这里使用的是MySQL

Tagged: , ,

Comments are closed.