网址: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 获取到后,抓取网页内的数据,基本上用response.doc('').text() 就可以获取到页面的数据了,括号内的引号的地方就填要抓取内容的标签 CSS 选择器
@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_informationfrom pyspider.libs.base_handler import *from pymongo import MongoClientclass 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