一,功能描述:
目标:从京东商城爬取商品信息,输出商品名称和价格
二、技术路线:
requests-re-bs4
三,程序设计结构:
1.爬取网页内容:getHTMLText()
2.提取信息到合适的数据结构中:parsePage()
3.利用数据结构展示并输出:printGoodsList()
四、体会:
本次实验遇到的最大技术难题就是怎么剔除HTML标签(查看源代码发现可以用i和em两个标签精确定位),后来查看了csdn大佬的文章找到了解决方案(在此表示感谢,文章链接真忘了):
title[i]=re.sub(r'<[^>]+>',"",str(title[i]),re.S)
from bs4 import BeautifulSoup
import requests
import re
def getHTMLText(url):
kv={'user-agent':'Mozilla/5.0 (Windows NT 6.1; rv:40.0) Gecko/20100101 Firefox/40.0'}
try:
r=requests.get(url,headers=kv,timeout=30)
r.raise_for_status()
r.encoding=r.apparent_encoding
return r.text
except:
return "-1"
def parsePage(ilt,html):
try:
soup=BeautifulSoup(html,'html.parser')
priceList=soup.find_all('div',attrs={'class':'p-price'})#提取所有class为p-price的标签
titleList=soup.find_all('div',attrs={'class':'p-name p-name-type-2'})
title=re.findall(r'<em>.*</em>',str(titleList))#需要提取的数据在em标签中,因此用此标签定位
price=re.findall(r'<i>\d*\.\d*</i>',str(priceList))#需要提取的数据在i标签中,因此用此标签定位
for i in range(len(title)):
price[i]=re.sub(r'<[^>]+>',"",str(price[i]),re.S)#清除标签
title[i]=re.sub(r'<[^>]+>',"",str(title[i]),re.S)#清除标签
ilt.append([price[i],title[i]])
except:
print("")
def printGoodsList(ilt):
tplt="{:4}\t{:8}\t{:16}"
print(tplt.format("序号","价格","商品名称"))
count=0
for i in range(len(ilt)):
count+=1
iltr=ilt[i]
print(tplt.format(count,iltr[0],iltr[1]))
def main():
goods='python爬虫'
start_url='https://search.jd.com/Search?keyword='+goods
infoList=[]
for i in range(1):
try:
url=start_url+'&enc=utf-8&page='+str(i)
html=getHTMLText(url)
parsePage(infoList,html)
except:
continue
printGoodsList(infoList)
main()