利用BeautifulSoup爬取静态html网站
例子:爬取quner网站信息
#首先导入bs4库
from bs4 import BeautifulSoup
import requests
# 获得网址源码
url ='https://travel.qunar.com/p-cs300195-hangzhou-jingdian'
r = requests.get(url)
#返回网页的html源码
soup = BeautifulSoup(r.text,'lxml')
此处我们要提取页面中的各景点对应信息,如景点名称、攻略数、点评数、星级评价等数据:#获取ul下的数据
ul = soup.find('ul',class_="list_item clrfix")
#从ul数据中找到所有li,返回一个列表
li = ul.find_all('li')
#返回的景点数据是个列表,我们先查看第一个景点的信息
li0 = li[0]
查看网页源码发现,景点名称西湖title位于第一个li的span class="cn_tit"下,同理分别查看攻略数、点评数、星级评价等数据的位置。
#我们新建一个字典来存放逐层抓取得到的数据字段
dic = {}
dic['攻略提到数'] =li0.find('div',class_="strategy_sum").text
dic['点评数'] = li0.find('div',class_="comment_sum").text
dic['景点名称'] = li0.find('span',class_="cn_tit").text
#注意:星级指数是在span的style属性下面,要注意获取属性值的方法
dic['星级指数'] = li0.find('span',class_="cur_star").attrs['style']
自动爬取多个网页
我们观察网站的url,发现每个页面只有url的最后一位数字不同,因此我们可以用拼接字符串来获得多个网页的网址
list_all = []
ur = 'https://travel.qunar.com/p-cs300195-hangzhou-jingdian-'
for i in range(1,11):
list_all.append(ur + str(i))
上面的例子是爬取一个页面一个景点的数据,我们也可以写个循环来获得一个页面li列表下的多个景点的数据信息。
因此,我们写个双重循环 来自动抓取多个页面上所有景点的信息:
data1 = []
for l in list_all:
r = requests.get(l)
soup = BeautifulSoup(r.text,'lxml')
ul = soup.find('ul',class_="list_item clrfix")
li = ul.find_all('li')
for lii in li:
dic = {}
dic['攻略提到数'] =lii.find('div',class_="strategy_sum").text
dic['点评数'] = lii.find('div',class_="comment_sum").text
dic['景点名称'] = lii.find('span',class_="cn_tit").text
dic['星级指数'] = lii.find('span',class_="cur_star").attrs['style']
data1.append(dic)
*注:以上数据来源于去哪儿网站,仅限学习交流使用。