BeautifulSoup爬虫入门(一)

本文介绍如何使用Python的BeautifulSoup库进行简单的网页爬取,包括解析网页、获取指定信息等,并提供了爬取TripAdvisor网站数据的具体实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

“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
from bs4 import BeautifulSoup
import time
用request的get方法请求访问网站
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查看了,会发现取得了该网页所有的信息

这是网页的部分截图,我们不需要拉取下所有的信息,而是希望仅仅得到每一个的名字、图片和多少条评论。可以右键指定位置,“检查”,就可以定位到具体的代码处,右键-copy-copy selector可以得到某元素的位置,利用这个位置可以定位到具体的名字,比如,“美国自然离世博物馆”这个超链接的具体位置是
“#ATTR_ENTRY_ > div.attraction_clarity_cell > div > div > div.listing_info > div.listing_title > a”
但是我们希望一次取出所有的标题名,而不是博物馆这一个,所以要取出父级的标签

也就是div.listing_title下面的a标签,图片的链接查找方法同理,只是用img[属性]的方法来确定属性,只查找width=180的图片
完整的代码如下:
注意select返回的是一个列表,若想取具体第几个,可以用title[0].text
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)





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值