“Beautiful Soup提供一些简单的、python式的函数用来处理导航、搜索、修改分析树等功能。它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简单,所以不需要多少代码就可以写出一个完整的应用程序。
Beautiful Soup自动将输入文档转换为Unicode编码,输出文档转换为utf-8编码。你不需要考虑编码方式,除非文档没有指定一个编码方式,这时,Beautiful Soup就不能自动识别编码方式了。然后,你仅仅需要说明一下原始编码方式就可以了。
Beautiful Soup已成为和lxml、html6lib一样出色的python解释器,为用户灵活地提供不同的解析策略或强劲的速度。”
本文是一个使用BeautifulSoup进行爬取信息的一个例子,要爬取的网站是https://www.tripadvisor.cn/Attractions-g60763-Activities-oa30-New_York_City_New_York.html,也就是这是我们用request请求访问的网站
我们的目标是进行简单的非登录爬取指定信息,以及爬取登录后可见的信息,不过BeautifulSoup处理JS的能力不够优秀,只能处理比较简单的HTML信息
首先,导入要用的库:
import requests
url='https://www.tripadvisor.cn/Attractions-g60763-Activities-oa30-New_York_City_New_York.html' wb_data = requests.get(url)然后创建BeautifulSoup的对象进行解析处理
soup = BeautifulSoup(wb_data.text, 'lxml')
此时就可以打印soup查看了,会发现取得了该网页所有的信息
titles = soup.select('div.listing_title > a') imgs = soup.select('img[width="180"]') for title, img in zip(titles, imgs): data = { 'title': title.get_text(), 'img': img.get('src') } print(data)
def getAttr(url,data=None): wb_data = requests.get(url) time.sleep(3) soup = BeautifulSoup(wb_data.text, 'lxml') titles = soup.select('div.listing_title > a') imgs = soup.select('img[width="180"]') for title, img in zip(titles, imgs): data = { 'title': title.get_text(), 'img': img.get('src') } print(data)
观察除第一页之外的其他各页的地址,形式如下:
第2页
https://www.tripadvisor.cn/Attractions-g60763-Activities-oa30-New_York_City_New_York.html
第3页
https://www.tripadvisor.cn/Attractions-g60763-Activities-oa60-New_York_City_New_York.html#FILTERED_LIST
第39页
https://www.tripadvisor.cn/Attractions-g60763-Activities-oa1140-New_York_City_New_York.html#FILTERED_LIST
也就是每一页的oa后从30到1140,每次增加30,可以写为:
urls =['https://www.tripadvisor.cn/Attractions-g60763-Activities-oa{}-New_York_City_New_York.html#FILTERED_LIST'.format(str(i)) for i in range(30,1140,30)]这样就可以用for循环来遍历每一页,这也就是为什么要在函数中用time.sleep(),
是为了不被反爬虫的措施发现
for oneUrl in urls: getAttr(oneUrl)有些信息是只有登录用户才可以看到,比如收藏的地点,可以右键检查后,
network,DOC下的Headers可以查看到cookie和User-Agent,如图:
保存在headers中,然后在进行request调用时加上headers的信息,就可以
访问只有登录用户可见的信息了:
def getSaved(url,data=None): wb_data = requests.get(url_save, headers=headers) soup = BeautifulSoup(wb_data.text, 'lxml') print(soup)