第一步:寻找网址规律
首先来展示一下原网页:
可以看出网页地址有规律,start=0,start=20,start=40(是这样的规律,这部分只展示两页)。这样就可以获取所有的网页地址。
第二步,爬取网页信息
这里只爬取前20页信息
urls=['https://book.douban.com/tag/金融?start='+str(i*20)for i in range(0,20)]#爬取多个页面
for url in urls:
headers={
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36'
}
req=requests.get(url,headers=headers)
req.encoding='utf-8'
html=req.text
这样就依次获取了网页的信息。
第三步:利用解析器取到想要取的内容
解析器我们使用Beautiful Soup(使用CSS选择器):
提取名称,出版信息,评分,评价数和简介
soup=BeautifulSoup(html,'lxml')
titles=['null','null','null','null','null','null','null','null','null','null','null','null','null','null','null','null','null','null','null','null']
infos=['null','null','null','null','null','null','null','null','null','null','null','null','null','null','null','null','null','null','null','null']
scores=['null','null','null','null','null','null','null','null','null','null','null','null','null','null','null','null','null','null','null','null']
nums= ['null','null','null','null','null','null','null','null','null','null','null','null','null','null','null','null','null','null','null','null','null','null','null','null','null']
comments=['null','null','null','null','null','null','null','null','null','null','null','null','null','null','null','null','null','null','null','null']
i=0
for a in soup.select('h2 a'):
title=a['title']
titles[i]=title
i=i+1
i=0
for pub in soup.select('div.pub'):
info=pub.string
infos[i]=info
i=i+1
i=0
for num in soup.select('span.rating_nums'):
score=num.string
scores[i]=score
for j in range(0,len(scores)):
if scores[j] ==None:
scores[j]='null'
i=i+1
i=0
for pl in soup.select('span.pl'):
num=pl.string
nums[i]=num
i=i+1
i=0
for comment in soup.select('.info p'):
comment=comment.string
comments[i]=comment
i=i+1
后续有写beautifulsoup专题,在此处不多做解释。
了解BeautifulSoup专题请点这里
解释一下我为什么写了这么复杂的一段代码:
在beautifulsoup直接取数时,一些简介中会没有信息,遇到这种情况的时候,就会有串行问题的出现,因此,在这里先定义好字符串,如果为 空值,那一行即写为’null‘,不会再有空值的出现。若有更好的办法,望留言,十分感谢。(我这里的i循环也写的复杂,望指正)。
第四步:写入csv
for k in range(0,20):
text='$'.join((titles[k],infos[k],scores[k],nums[k],comments[k]))+'\n'
text=text.replace('\n', '')
with open('C:/Users/asus/Desktop/python实践周/book.csv','a',encoding='utf-8') as f:
f.write(text+'\n')
全部代码:
urls=['https://book.douban.com/tag/金融?start='+str(i*20)for i in range(0,20)]#爬取多个页面
for url in urls:
headers={
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36'
}
req=requests.get(url,headers=headers)
req.encoding='utf-8'
html=req.text
soup=BeautifulSoup(html,'lxml')
titles=['null','null','null','null','null','null','null','null','null','null','null','null','null','null','null','null','null','null','null','null']
infos=['null','null','null','null','null','null','null','null','null','null','null','null','null','null','null','null','null','null','null','null']
scores=['null','null','null','null','null','null','null','null','null','null','null','null','null','null','null','null','null','null','null','null']
nums= ['null','null','null','null','null','null','null','null','null','null','null','null','null','null','null','null','null','null','null','null','null','null','null','null','null']
comments=['null','null','null','null','null','null','null','null','null','null','null','null','null','null','null','null','null','null','null','null']
i=0
for a in soup.select('h2 a'):
title=a['title']
titles[i]=title
i=i+1
i=0
for pub in soup.select('div.pub'):
info=pub.string
infos[i]=info
i=i+1
i=0
for num in soup.select('span.rating_nums'):
score=num.string
scores[i]=score
for j in range(0,len(scores)):
if scores[j] ==None:
scores[j]='null'
i=i+1
i=0
for pl in soup.select('span.pl'):
num=pl.string
nums[i]=num
i=i+1
i=0
for comment in soup.select('.info p'):
comment=comment.string
comments[i]=comment
i=i+1
for k in range(0,20):
text='$'.join((titles[k],infos[k],scores[k],nums[k],comments[k]))+'\n'
text=text.replace('\n', '')
with open('C:/Users/asus/Desktop/python实践周/book.csv','a',encoding='utf-8') as f:
f.write(text+'\n')
爬取内容展示:
再利用EXCEL数据分列就可以啦!