HTML5技术

教你分分钟学会用python爬虫框架Scrapy爬取心目中的女神 - 战神王恒(3)

字号+ 作者:H5之家 来源:H5之家 2016-09-01 11:00 我要评论( )

# !/usr/bin/env python # -*- coding:utf-8 -*- import scrapy import hashlib from beauty.items import JieYiCaiItem from scrapy.http import Request from scrapy.selector import HtmlXPathSelector from scr

#!/usr/bin/env python # -*- coding:utf-8 -*- import scrapy import hashlib from beauty.items import JieYiCaiItem from scrapy.http import Request from scrapy.selector import HtmlXPathSelector from scrapy.spiders import CrawlSpider, Rule from scrapy.linkextractors import LinkExtractor class JieYiCaiSpider(scrapy.spiders.Spider): count = 0 url_set = set() name = domain = allowed_domains = [] start_urls = [ , ] rules = [ ] def parse(self, response): md5_obj = hashlib.md5() md5_obj.update(response.url) md5_url = md5_obj.hexdigest() if md5_url in JieYiCaiSpider.url_set: pass else: JieYiCaiSpider.url_set.add(md5_url) hxs = HtmlXPathSelector(response) ): item = JieYiCaiItem() item[] = hxs.select().extract() item[] = hxs.select().re() item[] = hxs.select().extract() item[] = hxs.select().extract() item[] = hxs.select().extract() yield item current_page_urls = hxs.select().extract() for i in range(len(current_page_urls)): url = current_page_urls[i] ): url_ab = JieYiCaiSpider.domain + url yield Request(url_ab, callback=self.parse) spider

spider

上述代码中:对url进行md5加密的目的是避免url过长,也方便保存在缓存或数据库中。

此处代码的关键在于:

  • 将获取的数据封装在了Item对象中
  • yield Item对象 (一旦parse中执行yield Item对象,则自动将该对象交个pipelines的类来处理)
  • # # Don't forget to add your pipeline to the ITEM_PIPELINES setting # See: import json from twisted.enterprise import adbapi import MySQLdb.cursors import re mobile_re = re.compile(r) phone_re = re.compile(r) class JsonPipeline(object): def __init__(self): self.file = open(, ) def process_item(self, item, spider): line = % (item[][0].encode(), item[][0].encode()) self.file.write(line) return item class DBPipeline(object): def __init__(self): self.db_pool = adbapi.ConnectionPool(, db=, user=, passwd=, cursorclass=MySQLdb.cursors.DictCursor, use_unicode=True) def process_item(self, item, spider): query = self.db_pool.runInteraction(self._conditional_insert, item) query.addErrback(self.handle_error) return item def _conditional_insert(self, tx, item): tx.execute(, (item[][0], )) result = tx.fetchone() if result: pass else: phone_obj = phone_re.search(item[][0].strip()) phone = phone_obj.group() mobile_obj = mobile_re.search(item[][1].strip()) mobile = mobile_obj.group() values = ( item[][0], item[][0], phone, mobile, item[][2].strip(), item[][0]) tx.execute(, values) def handle_error(self, e): ,e pipelines

    pipelines

    上述代码中多个类的目的是,可以同时保存在文件和数据库中,保存的优先级可以在配置文件settings中定义。

     

    1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

    相关文章
    • Vue.js60分钟webpack项目模板快速入门 - keepfool

      Vue.js60分钟webpack项目模板快速入门 - keepfool

      2016-07-17 16:00

    • Vue.js60分钟browserify项目模板快速入门 - keepfool

      Vue.js60分钟browserify项目模板快速入门 - keepfool

      2016-07-17 14:00

    • 30分钟全面解析-SQL事务+隔离级别+阻塞+死锁 - jackson0714

      30分钟全面解析-SQL事务+隔离级别+阻塞+死锁 - jackson0714

      2016-07-06 11:00

    • Vue.js60分钟组件快速入门(下篇) - keepfool

      Vue.js60分钟组件快速入门(下篇) - keepfool

      2016-07-03 14:04

    网友点评
    h