Python实现的一只从百度开始不断搜索的小爬虫
简介
本文介绍如何使用Python编写一个可以从百度开始不断搜索的小爬虫,并获取搜索结果中的信息。
实现步骤
- 安装相关库
我们需要使用requests和beautifulsoup4库进行网页的爬取和解析。可以通过以下命令安装:
pip install requests beautifulsoup4
- 网页的爬取
首先,我们需要访问百度,并获取搜索结果页面的HTML代码。可以使用requests库完成。代码示例如下:
import requests
# 请求百度
url = "https://www.baidu.com/s"
params = {
"wd": "Python"
}
response = requests.get(url, params=params)
html = response.text
上面的代码中,我们使用requests.get()方法发送了一个GET请求到百度搜索页面,并将搜索的关键字设置为"Python"。可以根据需求修改关键字。注意到搜索页返回的HTML代码也可能会包含一些垃圾信息和不必要的广告,这里我们需要使用beautifulsoup4库对HTML代码进行解析和过滤。
- HTML代码的解析和过滤
首先,需要使用beautifulsoup库将HTML代码解析为一个DOM树。我们可以使用lxml解析器来解析HTML代码。代码示例如下:
from bs4 import BeautifulSoup
# 解析HTML代码
soup = BeautifulSoup(html, "lxml")
解析后,我们还需要过滤出搜索结果条目的信息。在百度搜索页面中,每一条搜索结果都包含在一个\
containers = soup.select(".c-container")
其中,select()方法中的参数".c-container"是CSS选择器,表示选取所有类名为"c-container"的标签。
- 获取搜索结果的信息
在选取了所有搜索结果容器后,我们还需要进一步从中提取出我们需要的信息,比如搜索结果的标题、URL、摘要等。因为不同搜索结果条目的结构可能不同,因此需要分别处理每个结果条目。下面是一个示例代码,用于提取第一个搜索结果的标题、URL和摘要:
# 获取第一个搜索结果的标题、URL和摘要
container = containers[0]
title = container.select_one("h3 a").text # 提取标题
url = container.select_one(".c-showurl").text # 提取URL
abstract = container.select_one(".c-abstract").text # 提取摘要
print(title, url, abstract)
上面的示例代码中,我们使用了select_one()方法选取了一个\标签和两个类名分别为"c-showurl"和"c-abstract"的标签,然后使用.text属性来提取其中的文本内容。
- 实现循环搜索功能
到了这一步,我们就可以获取单个搜索结果的信息。如果要实现从百度开始不断搜索的小爬虫的话,需要使用循环实现。在每一轮循环中,我们需要从搜索结果的容器中选取下一页的URL,然后访问下一页,进而重复上面的步骤。下面是一个简单的示例代码:
import requests
from bs4 import BeautifulSoup
# 第一次搜索
url = "https://www.baidu.com/s"
params = {
"wd": "Python"
}
response = requests.get(url, params=params)
soup = BeautifulSoup(response.text, "lxml")
# 搜索循环
for i in range(10): # 设定循环次数为10
containers = soup.select(".c-container")
for container in containers:
title = container.select_one("h3 a").text
url = container.select_one(".c-showurl").text
abstract = container.select_one(".c-abstract").text
print(title, url, abstract)
next_page_link = soup.select_one("#page a:last-child")
if not next_page_link: # 如果没有下一页,就退出循环
break
next_page_url = "https://www.baidu.com" + next_page_link["href"]
response = requests.get(next_page_url)
soup = BeautifulSoup(response.text, "lxml")
上面的示例代码中,我们使用了CSS选择器"#page a:last-child"选取了下一页链接的标签,并将其链接与"https://www.baidu.com"组合成完整的URL。如果没有下一页链接,就会退出循环。
示例说明
示例1:获取豆瓣电影TOP250的电影名和评分
下面是一个示例代码,用于爬取豆瓣电影TOP250的电影名和评分:
import requests
from bs4 import BeautifulSoup
url = "https://movie.douban.com/top250"
response = requests.get(url)
soup = BeautifulSoup(response.text, "lxml")
for i in range(10): # 循环10页
containers = soup.select(".info")
for container in containers:
name = container.select_one(".title").text
score = container.select_one(".rating_num").text
print(name, score)
next_page_link = soup.select_one(".next a")
if not next_page_link: # 如果没有下一页,就退出循环
break
next_page_url = url + next_page_link["href"]
response = requests.get(next_page_url)
soup = BeautifulSoup(response.text, "lxml")
上面的示例代码中,我们使用requests库发送了GET请求,然后使用beautifulsoup4库对HTML代码进行解析。接下来,我们选取了所有电影信息容器,并使用select_one()方法选取了其中的电影标题和评分。最后,我们使用循环和分页链接来实现了对豆瓣电影TOP250列表的爬取。
示例2:获取糗事百科的最新段子
下面是一个示例代码,用于爬取糗事百科的最新段子:
import requests
from bs4 import BeautifulSoup
url = "https://www.qiushibaike.com/text/"
response = requests.get(url)
soup = BeautifulSoup(response.text, "lxml")
while True: # 循环获取段子
containers = soup.select(".article")
for container in containers:
author = container.select_one(".author h2").text
content = container.select_one(".content span").text.strip()
print(author, content)
next_page_link = soup.select_one(".next")
if not next_page_link: # 如果没有下一页,就退出循环
break
next_page_url = "https://www.qiushibaike.com" + next_page_link["href"]
response = requests.get(next_page_url)
soup = BeautifulSoup(response.text, "lxml")
上面的示例代码中,我们使用requests库发送了GET请求,然后使用beautifulsoup4库对HTML代码进行解析。接下来,我们选取了所有段子容器,并使用select_one()方法选取了其中的作者和段子内容。最后,我们使用循环和分页链接来实现了对最新段子的爬取。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python实现的一只从百度开始不断搜索的小爬虫 - Python技术站