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
pyspider 简单应用之快速问医生药品抓取(一)的更多相关文章
- Python爬虫入门教程 24-100 微医挂号网医生数据抓取
1. 写在前面 今天要抓取的一个网站叫做微医网站,地址为 https://www.guahao.com ,我们将通过python3爬虫抓取这个网址,然后数据存储到CSV里面,为后面的一些分析类的教程做 ...
- 使用Chrome快速实现数据的抓取(四)——优点
些一个抓取WEB页面的数据程序比较简单,大多数语言都有相应的HTTP库,一个简单的请求响应即可,程序发送Http请求给Web服务器,服务器返回HTML文件.交互方式如下: 在使用DevProtocol ...
- 使用Chrome快速实现数据的抓取(三)——JQuery
使用Chrome抓取页面一个非常方便的地方就是它可以执行JS,也就是说我们可以通过JS函数获取我们想要的数据.一个非常强大易用的库就是Jquery,本文就简单的介绍一下使用Chrome获取数据时Jqu ...
- 使用Chrome快速实现数据的抓取(五)—— puppeteer
如果要以自动化的方式驱动Chrome进行数据抓取,必须实现Chrome Dev Protocol协议的客户端.这个协议本身并不复杂,我在之前的文章中也简单的介绍过一下. Google本身有一个Node ...
- 使用Chrome快速实现数据的抓取(二)——协议
在前面的文章简单的介绍了一下Chrome调试模式的启动方式,但前面的API只能做到简单的打开,关闭标签操作,当我们需要对某个标签页进行详细的操作时,则需要用到页面管理API.首先我们还是来回顾下获取页 ...
- 使用Chrome快速实现数据的抓取(一)——概述
对于一些简单的网页,我们可以非常容易的通过Develop Tool来获取其请求报文规律,并仿照其构建报文来获取页面信息.但是,随着网页越来越复杂,许多页面是由js动态渲染生成的.要获取这类信息,则需要 ...
- 《编程快速上手》--web抓取--利用webbrowser模块的mapIT.py
1.代码如下 #! python3 # mapIT.py - Launches a map in the browser using an address from the # command lin ...
- Python实现简单的网页抓取
现在开源的网页抓取程序有很多,各种语言应有尽有. 这里分享一下Python从零开始的网页抓取过程 第一步:安装Python 点击下载适合的版本https://www.python.org/ 我这里选择 ...
- 利用JS跨域做一个简单的页面訪问统计系统
事实上在大部分互联网web产品中,我们一般会用百度统计或者谷歌统计分析系统,通过在程序中引入特定的JS脚本,然后便能够在这些统计系统中看到自己站点页面详细的訪问情况.可是有些时候,因为一些特殊情况,我 ...
随机推荐
- PowerMockito 同时mock多个对象
有时候,需要测试的方法内有collections结构,就需要同时mock多个对象 被测方法: public class EmployeeService { public List<Integer ...
- myeclipse激活法,可以试一试
我的myeclipse2014也是这样激活: 第一步:输入任意用户名 第二步:点击Systemid... 按钮,自动生成本机器的systemid. 第三步: 点菜单Tools->RebuildK ...
- Makefile 一点一滴(二)—— 输出文件到指定路径
先来看最简单的 makefile 文件: TestCpp : TestCpp.o g++ -o TestCpp TestCpp.o TestCpp.o : TestCpp.cpp g++ -c Tes ...
- jquery点击获取子元素ID值
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- How to use a 32bit Oracle11_g client in 64 win system and not conflict with sqldeveloper 64 bit tool
At the path:C:\app\USER_NAME\product\11.2.0\client_1\sqldeveloper\sqldeveloper\bin, there a file 'sq ...
- c4,configure the debug environment
Yesterday I found a tiny C compiler (less than 600 line of C code, containing commits) called " ...
- z变换
---恢复内容开始--- z变换作用很大 将离散信号从时间域转到频率域 网址 ---恢复内容结束--- z变换作用很大 将离散信号从时间域转到频率域 网址 http://stackoverflow.c ...
- OGG for DB2 i 12.2发布
2016-04-15 Oracle发布了GoldenGate for DB2 i 12.2.0.1.2,软件可以从OTN 或 eDelivery下载.这是第一个针对DB2 for i的12.2版本.此 ...
- em 和 px相互转换
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- UE4蓝图编程的第一步
认识UE4蓝图中颜色与变量类型: UE4中各个颜色对应着不同的变量,连接点和连线的颜色都在表示此处是什么类型的变量.对于初学者来说一开始看到那么多连接点, 可能会很茫然,搞不清还怎么连,如果知道了颜色 ...