Python爬取百度搜索结果(标题,摘要,链接)

Velika ·
更新时间:2024-09-20
· 864 次阅读

近期想要爬取百度搜索的结果,网上的教程一直没有找到可以直接用的,尝试了几个小时终于摸索出了可以用的代码。

主要的问题在于 url 的形式,之前的教程一般是这种形式:

url = 'https://www.baidu.com/s?' + word + '&pn=0' # word为搜索关键词,pn用来分页

由于百度每个页面显示10条结果,'&pn=n' 表示第 n 条结果,n = 0~9 表示第一页,n = 10~19 表示第二页,以此类推。然而在运行代码时发现这种形式的 url 从第二页开始就无法正常爬取了。关于 url 格式我一直没有搞清楚,但是我摸索出了一种方法能得到可用的 url;

首先按照上面那个 url 形式,比如要搜索“咖啡”,则将 'word' 改为 "咖啡": https://www.baidu.com/s?咖啡&pn=0 并复制到浏览器, 如下图,这是搜索“咖啡”以后的第一页:

然后点击下方页码,打开第二页: 

下图为搜索“咖啡”结果的第二页,可以看到上方 url 地址出现 '&pn=10';

复制此地址作为我们的搜索 url,形式如下(复制以后中文“咖啡”两字被自动编码了):

url = 'https://www.baidu.com/s?wd=%E5%92%96%E5%95%A1&pn='+ number +'&oq=%E5%92%96%E5%95%A1&ie=utf-8&usm=1&rsv_pq=9ccd7f6500120ebb&rsv_t=d92fDeHr8TAXzN%2FuqzNW3xd3BcU3lunThKY2lkUUobFc3Ihjx46MPW4iNbc'

以下是全部代码:

import time from bs4 import BeautifulSoup #处理抓到的页面 import sys import requests import re import importlib importlib.reload(sys)#编码转换,python3默认utf-8,一般不用加 #ff = open('test.txt', 'w') headers = { 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept-Encoding': 'gzip, deflate, compress', 'Accept-Language': 'en-us;q=0.5,en;q=0.3', 'Cache-Control': 'max-age=0', 'Connection': 'keep-alive', 'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:22.0) Gecko/20100101 Firefox/22.0' } #定义头文件 def getfromBaidu(): start = time.clock() for k in range(1, 3): geturl(k) end = time.clock() print(end-start) def geturl(k): number = str((k - 1) * 10) path = 'https://www.baidu.com/s?wd=%E5%92%96%E5%95%A1&pn=' + number + '&oq=%E5%92%96%E5%95%A1&ie=utf-8&usm=1&rsv_pq=9ccd7f6500120ebb&rsv_t=d92fDeHr8TAXzN%2FuqzNW3xd3BcU3lunThKY2lkUUobFc3Ihjx46MPW4iNbc' #print(path) content = requests.get(path,headers=headers) #使用BeautifulSoup解析html soup = BeautifulSoup(content.text,'html.parser') tagh3 = soup.find_all('div', { 'class', 'result c-container '}) #print(tagh3) for h3 in tagh3: try: title = h3.find(name = "h3", attrs = { "class": re.compile( "t")}).find('a').text.replace("\"","") print(title) #ff.write(title+'\n') except: title = '' try: abstract = h3.find(name = "div", attrs = { "class": re.compile( "c-abstract")}).text.replace("\"","") print(abstract) #ff.write(abstract+'\n') except: abstract = '' try: url = h3.find(name = "a", attrs = { "class": re.compile( "c-showurl")}).get('href') print(url+'\n') #ff.write(url+'\n') except: url = '' #ff.write('\n') if __name__ == '__main__': getfromBaidu()

爬取结果如下:


作者:CCchaha



摘要 百度搜索 Python

需要 登录 后方可回复, 如果你还没有账号请 注册新账号