python数据抓取分析的示例代码(python + mongodb)


Posted in Python onDecember 25, 2017

本文介绍了Python数据抓取分析,分享给大家,具体如下:

编程模块:requests,lxml,pymongo,time,BeautifulSoup

首先获取所有产品的分类网址:

def step():
 try:
  headers = {
   。。。。。
   }
  r = requests.get(url,headers,timeout=30)
  html = r.content
  soup = BeautifulSoup(html,"lxml")
  url = soup.find_all(正则表达式)
  for i in url:
   url2 = i.find_all('a')
   for j in url2:
     step1url =url + j['href']
     print step1url
     step2(step1url)
 except Exception,e:
  print e

我们在产品分类的同时需要确定我们所访问的地址是产品还是又一个分类的产品地址(所以需要判断我们访问的地址是否含有if判断标志):

def step2(step1url):
 try:
  headers = {
   。。。。
   }
  r = requests.get(step1url,headers,timeout=30)
  html = r.content
  soup = BeautifulSoup(html,"lxml")
  a = soup.find('div',id='divTbl')
  if a:
   url = soup.find_all('td',class_='S-ITabs')
   for i in url:
    classifyurl = i.find_all('a')
    for j in classifyurl:
      step2url = url + j['href']
      #print step2url
      step3(step2url)
  else:
   postdata(step1url)

当我们if判断后为真则将第二页的分类网址获取到(第一个步骤),否则执行postdata函数,将网页产品地址抓取!

def producturl(url):
 try:
  p1url = doc.xpath(正则表达式)
  for i in xrange(1,len(p1url) + 1):
   p2url = doc.xpath(正则表达式)
   if len(p2url) > 0:
    producturl = url + p2url[0].get('href')
    count = db[table].find({'url':producturl}).count()
    if count <= 0:
      sn = getNewsn()
      db[table].insert({"sn":sn,"url":producturl})
      print str(sn) + 'inserted successfully'
    else:
      'url exist'
 except Exception,e:
  print e

其中为我们所获取到的产品地址并存入mongodb中,sn作为地址的新id。

下面我们需要在mongodb中通过新id索引来获取我们的网址并进行访问,对产品进行数据分析并抓取,将数据更新进数据库内!

其中用到最多的BeautifulSoup这个模块,但是对于存在于js的价值数据使用BeautifulSoup就用起来很吃力,所以对于js中的数据我推荐使用xpath,但是解析网页就需要用到HTML.document_fromstring(url)方法来解析网页。

对于xpath抓取价值数据的同时一定要细心!如果想了解xpath就在下面留言,我会尽快回答!

def parser(sn,url):
 try:
  headers = {
   。。。。。。
   }
  r = requests.get(url, headers=headers,timeout=30)
  html = r.content
  soup = BeautifulSoup(html,"lxml")
  dt = {}
  #partno
  a = soup.find("meta",itemprop="mpn")
  if a:
   dt['partno'] = a['content']
  #manufacturer
  b = soup.find("meta",itemprop="manufacturer")
  if b:
   dt['manufacturer'] = b['content']
  #description
  c = soup.find("span",itemprop="description")
  if c:
   dt['description'] = c.get_text().strip()
  #price
  price = soup.find("table",class_="table table-condensed occalc_pa_table")
  if price:
   cost = {}
   for i in price.find_all('tr'):
    if len(i) > 1:
     td = i.find_all('td')
     key=td[0].get_text().strip().replace(',','')
     val=td[1].get_text().replace(u'\u20ac','').strip()
     if key and val:
      cost[key] = val
   if cost:
    dt['cost'] = cost
    dt['currency'] = 'EUR'
  
  #quantity
  d = soup.find("input",id="ItemQuantity")
  if d:
   dt['quantity'] = d['value']
  #specs
  e = soup.find("div",class_="row parameter-container")
  if e:
   key1 = []
   val1= []
   for k in e.find_all('dt'):
    key = k.get_text().strip().strip('.')
    if key:
     key1.append(key)
   for i in e.find_all('dd'):
    val = i.get_text().strip()
    if val:
     val1.append(val)
   specs = dict(zip(key1,val1))
  if specs:
   dt['specs'] = specs
   print dt   
  if dt:
   db[table].update({'sn':sn},{'$set':dt})
   print str(sn) + ' insert successfully'
   time.sleep(3)
  else:
   error(str(sn) + '\t' + url)
 except Exception,e:
  error(str(sn) + '\t' + url)
  print "Don't data!"

最后全部程序运行,将价值数据分析处理并存入数据库中!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
在Django的视图中使用form对象的方法
Jul 18 Python
Python中强大的命令行库click入门教程
Dec 26 Python
Python 字典与字符串的互转实例
Jan 13 Python
pandas将numpy数组写入到csv的实例
Jul 04 Python
python广度优先搜索得到两点间最短路径
Jan 17 Python
python 对字典按照value进行排序的方法
May 09 Python
python使用原始套接字发送二层包(链路层帧)的方法
Jul 22 Python
详解django实现自定义manage命令的扩展
Aug 13 Python
tensorboard 可以显示graph,却不能显示scalar的解决方式
Feb 15 Python
python字典key不能是可以是啥类型
Aug 04 Python
Python 代码调试技巧示例代码
Aug 11 Python
python turtle绘制多边形和跳跃和改变速度特效
Mar 16 Python
Python实现生成随机日期字符串的方法示例
Dec 25 #Python
浅谈Python NLP入门教程
Dec 25 #Python
Python图形绘制操作之正弦曲线实现方法分析
Dec 25 #Python
关于Django显示时间你应该知道的一些问题
Dec 25 #Python
今天 平安夜 Python 送你一顶圣诞帽 @微信官方
Dec 25 #Python
python回调函数中使用多线程的方法
Dec 25 #Python
python创建列表和向列表添加元素的实现方法
Dec 25 #Python
You might like
绿山咖啡和蓝山咖啡
2021/03/04 新手入门
php 生成文字png图片的代码
2011/04/17 PHP
php跨域cookie共享使用方法
2014/02/20 PHP
PHP5.5和之前的版本empty函数的不同之处
2014/06/13 PHP
ThinkPHP中使用ajax接收json数据的方法
2014/12/18 PHP
PHP基于Redis消息队列实现发布微博的方法
2017/05/03 PHP
使用一个for循环将N*N的二维数组的所有值置1实现方法
2017/05/29 PHP
jQuery 数据缓存模块进化史详细介绍
2012/11/19 Javascript
jquery简单瀑布流实现原理及ie8下测试代码
2013/01/23 Javascript
js去除空格的12种实用方法
2013/11/08 Javascript
页面定时刷新(1秒刷新一次)
2013/11/22 Javascript
JS小功能(操作Table--动态添加删除表格及数据)实现代码
2013/11/28 Javascript
JavaScript实现判断图片是否加载完成的3种方法整理
2015/03/13 Javascript
详解AngularJS 模块化
2017/06/14 Javascript
解决vue2.x中数据渲染以及vuex缓存的问题
2017/07/13 Javascript
Vue 多层组件嵌套二种实现方式(测试实例)
2017/09/08 Javascript
AngularJS实现图片上传和预览功能的方法分析
2017/11/08 Javascript
详解Vue Elememt-UI构建管理后台
2018/02/27 Javascript
JS算法题之查找数字在数组中的索引位置
2019/05/15 Javascript
微信小程序实现pdf、word等格式文件上传的方法
2019/09/10 Javascript
Tornado Web服务器多进程启动的2个方法
2014/08/04 Python
python timestamp和datetime之间转换详解
2017/12/11 Python
python实现Floyd算法
2018/01/03 Python
Python 计算任意两向量之间的夹角方法
2019/07/05 Python
Python编写通讯录通过数据库存储实现模糊查询功能
2019/07/18 Python
Python元组 tuple的概念与基本操作详解【定义、创建、访问、计数、推导式等】
2019/10/30 Python
python opencv如何实现图片绘制
2020/01/19 Python
TensorFlow 显存使用机制详解
2020/02/03 Python
python基于Kivy写一个图形桌面时钟程序
2021/01/28 Python
我的珠宝盒:Ma boîte à bijoux
2019/08/27 全球购物
少先队入队活动方案
2014/02/08 职场文书
检查接待方案
2014/02/27 职场文书
公司自我介绍演讲稿
2014/08/21 职场文书
2015年社会实践个人总结
2015/03/06 职场文书
浅谈怎么给Python添加类型标注
2021/06/08 Python
MySQL 使用索引扫描进行排序
2021/06/20 MySQL