Python结合MongoDB实现电商数据抓取与存储实战
本文详细介绍利用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中的区别》等。如有任何问题,欢迎留言交流讨论。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









