Python结合MongoDB的数据抓取与分析实战
本文详细演示了使用Python进行数据抓取与分析的完整流程。通过requests获取页面,利用BeautifulSoup和XPath解析HTML及JS动态数据,并将结果存入MongoDB。文章涵盖分类网址获取、产品详情页抓取、数据清洗入库及异常处理等核心步骤,提供具体代码实现供参考。
本文介绍如何利用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模块。然而,对于存在于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!"
最后,运行全部程序,对价值数据进行分析和处理,并将其存入数据库中。
以上就是本文的全部内容,希望对各位的学习有所帮助,也欢迎大家多多支持本站。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













