Python结合MongoDB实现电商数据抓取与存储实战

键盘旁的猫
键盘旁的猫
发布时间:2026-10-13 | 2人浏览过
原创

本文详细介绍利用Python进行数据抓取的完整流程,涵盖分类网址获取、产品链接识别及详情解析。通过requests发起请求,结合BeautifulSoup与XPath处理HTML及JS动态数据,最终将结构化信息存入MongoDB数据库。文中提供了关键代码逻辑与异常处理机制,帮助开发者实现高效的数据采集与持久化存储。

本文分享实用的技术干货。

主要探讨基于Python的数据抓取与分析方法。

核心编程模块包括:requests用于网络请求,lxml和BeautifulSoup用于HTML解析,pymongo负责与MongoDB数据库交互,以及time模块用于控制请求频率。

第一步是获取所有产品的分类网址列表。

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模块。然而,对于存在于JavaScript动态渲染中的价值数据,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结合MongoDB进行数据抓取的详细介绍,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他文章,如《Python探索之创建二叉树》、《Python探索之修改Python搜索路径》、《浅谈python中copy和deepcopy中的区别》等。如有任何问题,欢迎留言交流讨论。

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表