pyspider 简单应用之快速问医生药品抓取(一)

网址:http://yp.120ask.com/search/-0-0--0-0-0-0.html

from pyspider.libs.base_handler import *

class Handler(BaseHandler):
    crawl_config = {
    }

    @every(minutes=24 * 60)
    def on_start(self):
        #进入主页
        self.crawl('http://yp.120ask.com/search/-0-0--0-0-0-0.html', callback=self.list_page)

 

鼠标放在药品名字上面,右键审查元素

明显可以看到点击的网址在<a>标签里面  右键 copy CSS选择器,如果想拿到这一页的所有点击的URL,多copy几个

#gallery > ul > li:nth-child(1) > dl > dd.s_dd1 > a

#gallery > ul > li:nth-child(2) > dl > dd.s_dd1 > a

#gallery > ul > li:nth-child(5) > dl > dd.s_dd1 > a

把不同的地方去掉 

#gallery > ul > li > dl > dd.s_dd1 > a

拿到所有翻页的URL,右键审查下一页的元素 ,copy CSS选择器

body > div.g-index-con.m1100.clears > div.p_contright.fr > div.s_pagediv > div > a.page-next

或者 写划横线的 a.page-next 也可以

 

 @config(age=10 * 24 * 60 * 60)
    def list_page(self, response):
        #模拟点击药品
        for each in response.doc('#gallery > ul > li > dl > dd.s_dd1 > a').items():
            self.crawl(each.attr.href, callback=self.index_page)
        #模拟点击下一页     
        for each in response.doc('a.page-next').items():
            self.crawl(each.attr.href, callback=self.list_page)

 所有的url 获取到后,抓取网页内的数据,使用pyquery 获取数据

    @config(age=10 * 24 * 60 * 60)
    def index_page(self, response):
        res={}
        #药品通用名称
        res['药品通用名称']=response.doc('body > div.drugCont > div.partTwo.clears > div.partTwoLeft > div.drugDecri > div > p.name.clears > var > i:nth-child(1)').text()
     

      #商品名称
      res['商品名称']=response.doc('body > div.drugCont > div.partTwo.clears > div.partTwoLeft > div.drugDecri > div > p.name.clears > var > i:nth-child(2)').text()

      #汉语拼音
      res['汉语拼音']=response.doc('body > div.drugCont > div.partTwo.clears > div.partTwoLeft > div.drugDecri > div > p.name.clears > var > i:nth-child(3)').text()

      #药品主要成分
      res['主要成分']=response.doc('body > div.drugCont > div.partTwo.clears > div.partTwoLeft > div.drugDecri > div > p:nth-child(2) > var').text()

      #药品性状
      res['药品性状']=response.doc('body > div.drugCont > div.partTwo.clears > div.partTwoLeft > div.drugDecri > div > p:nth-child(3) > var').text()


      #试用症
      res['试用症']=response.doc('body > div.drugCont > div.partTwo.clears > div.partTwoLeft > div.drugDecri > div > p:nth-child(4) > var').text()


      #主治疾病
      res['主治疾病']=response.doc('body > div.drugCont > div.partTwo.clears > div.partTwoLeft > div.drugDecri > div > p:nth-child(5) > var').text()


      #规格型号
      res['规格型号']=response.doc('body > div.drugCont > div.partTwo.clears > div.partTwoLeft > div.drugDecri > div > p:nth-child(6) > var').text()


      #用法用量
      res['用法用量']=response.doc('body > div.drugCont > div.partTwo.clears > div.partTwoLeft > div.drugDecri > div > p:nth-child(7) > var').text()


      #不良反应
      res['不良反应']=response.doc('body > div.drugCont > div.partTwo.clears > div.partTwoLeft > div.drugDecri > div > p:nth-child(8) > var').text()


      #禁忌
      res['禁忌']=response.doc('body > div.drugCont > div.partTwo.clears > div.partTwoLeft > div.drugDecri > div > p:nth-child(9) > var').text()


      #注意事项
      res['注意事项']=response.doc('body > div.drugCont > div.partTwo.clears > div.partTwoLeft > div.drugDecri > div > p:nth-child(10) > var').text()


      #药物互相作用
      res['药物互相作用']=response.doc('body > div.drugCont > div.partTwo.clears > div.partTwoLeft > div.drugDecri > div > p:nth-child(11) > var').text()


      #贮藏
      res['贮藏']=response.doc('body > div.drugCont > div.partTwo.clears > div.partTwoLeft > div.drugDecri > div > p:nth-child(12) > var').text()


      #有效期
      res['有效期']=response.doc('body > div.drugCont > div.partTwo.clears > div.partTwoLeft > div.drugDecri > div > p:nth-child(13) > var').text()


      #执行标准
      res['执行标准']=response.doc('body > div.drugCont > div.partTwo.clears > div.partTwoLeft > div.drugDecri > div > p:nth-child(14) > var').text()


      #批准文号
      res['批准文号']=response.doc('body > div.drugCont > div.partTwo.clears > div.partTwoLeft > div.drugDecri > div > p:nth-child(15) > var').text()


      #生产企业
      res['生产企业']=response.doc('body > div.drugCont > div.partTwo.clears > div.partTwoLeft > div.drugDecri > div > p:nth-child(16) > var').text()

这里博主把抓取到的数据存到mongo中,建立字典res

保存数据到 drugsss_information 集合里面

self.save_data('drugsss_information',res) 

下面是存入到mongoDB中的函数

def save_data(self,table_name,result):
        
        conn = MongoClient("localhost",27017) 

        db = conn.Fast_ask_doctor_drugs
        
        print table_name

        posts = db[table_name]
        
        try:
            
            posts.insert(result)

        except Exception,e:

            print e

 最后附上所有的代码

 

#!/usr/bin/env python
# -*- encoding: utf-8 -*-
# Created on 2016-10-18 11:09:15
# Project: Drug_information

from pyspider.libs.base_handler import *
from pymongo import MongoClient

class Handler(BaseHandler):
    crawl_config = {
    }

    @every(minutes=24 * 60)
    def on_start(self):
        #进入主页
        self.crawl('http://yp.120ask.com/search/-0-0--0-0-0-0.html', callback=self.list_page)
    
    @config(age=10 * 24 * 60 * 60)
    def list_page(self, response):
        #模拟点击药品
        for each in response.doc('#gallery > ul > li > dl > dd.s_dd1 > a').items():
            self.crawl(each.attr.href, callback=self.index_page)
        #模拟点击下一页     
        for each in response.doc('a.page-next').items():
            self.crawl(each.attr.href, callback=self.list_page)
    
    @config(age=10 * 24 * 60 * 60)
    def index_page(self, response):
       
        res={}
        #药品通用名称
        res['药品通用名称']=response.doc('body > div.drugCont > div.partTwo.clears > div.partTwoLeft > div.drugDecri > div > p.name.clears > var > i:nth-child(1)').text()
            
        #商品名称
        res['商品名称']=response.doc('body > div.drugCont > div.partTwo.clears > div.partTwoLeft > div.drugDecri > div > p.name.clears > var > i:nth-child(2)').text()
            
        #汉语拼音
        res['汉语拼音']=response.doc('body > div.drugCont > div.partTwo.clears > div.partTwoLeft > div.drugDecri > div > p.name.clears > var > i:nth-child(3)').text()
            
        #药品主要成分
        res['主要成分']=response.doc('body > div.drugCont > div.partTwo.clears > div.partTwoLeft > div.drugDecri > div > p:nth-child(2) > var').text()
            
        #药品性状
        res['药品性状']=response.doc('body > div.drugCont > div.partTwo.clears > div.partTwoLeft > div.drugDecri > div > p:nth-child(3) > var').text()
            
            
        #试用症
        res['试用症']=response.doc('body > div.drugCont > div.partTwo.clears > div.partTwoLeft > div.drugDecri > div > p:nth-child(4) > var').text()
            
            
        #主治疾病
        res['主治疾病']=response.doc('body > div.drugCont > div.partTwo.clears > div.partTwoLeft > div.drugDecri > div > p:nth-child(5) > var').text()
           
            
        #规格型号
        res['规格型号']=response.doc('body > div.drugCont > div.partTwo.clears > div.partTwoLeft > div.drugDecri > div > p:nth-child(6) > var').text()
           
            
        #用法用量
        res['用法用量']=response.doc('body > div.drugCont > div.partTwo.clears > div.partTwoLeft > div.drugDecri > div > p:nth-child(7) > var').text()
           
            
        #不良反应
        res['不良反应']=response.doc('body > div.drugCont > div.partTwo.clears > div.partTwoLeft > div.drugDecri > div > p:nth-child(8) > var').text()
            
            
        #禁忌
        res['禁忌']=response.doc('body > div.drugCont > div.partTwo.clears > div.partTwoLeft > div.drugDecri > div > p:nth-child(9) > var').text()
           
            
        #注意事项
        res['注意事项']=response.doc('body > div.drugCont > div.partTwo.clears > div.partTwoLeft > div.drugDecri > div > p:nth-child(10) > var').text()
           
            
        #药物互相作用
        res['药物互相作用']=response.doc('body > div.drugCont > div.partTwo.clears > div.partTwoLeft > div.drugDecri > div > p:nth-child(11) > var').text()
           
            
        #贮藏
        res['贮藏']=response.doc('body > div.drugCont > div.partTwo.clears > div.partTwoLeft > div.drugDecri > div > p:nth-child(12) > var').text()
          
            
        #有效期
        res['有效期']=response.doc('body > div.drugCont > div.partTwo.clears > div.partTwoLeft > div.drugDecri > div > p:nth-child(13) > var').text()
          
            
        #执行标准
        res['执行标准']=response.doc('body > div.drugCont > div.partTwo.clears > div.partTwoLeft > div.drugDecri > div > p:nth-child(14) > var').text()
           
            
        #批准文号
        res['批准文号']=response.doc('body > div.drugCont > div.partTwo.clears > div.partTwoLeft > div.drugDecri > div > p:nth-child(15) > var').text()
            
            
        #生产企业
        res['生产企业']=response.doc('body > div.drugCont > div.partTwo.clears > div.partTwoLeft > div.drugDecri > div > p:nth-child(16) > var').text()
        #print res
        self.save_data('drugsss_information',res)
            
    
    def save_data(self,table_name,result):
        
        conn = MongoClient("localhost",27017) 

        db = conn.Fast_ask_doctor_drugs
        
        print table_name

        posts = db[table_name]
        
        try:
            
            posts.insert(result)

        except Exception,e:

            print e
       
        

 

转载于:https://www.cnblogs.com/Vergissmeinnicht/p/6231942.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值