鱼C论坛

 找回密码
 立即注册
查看: 488|回复: 1

Python爬取百度搜索结果显示0

[复制链接]
发表于 2024-7-21 11:48:15 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
RT,不太懂为什么,基本思路就是直接开爬然后历遍,查了好几次F12也没看出来哪里有问题
  1. import requests
  2. from bs4 import BeautifulSoup
  3. import pandas as pd
  4. from time import sleep
  5. import re
  6. import random
  7. import os

  8. headers = {
  9.         "User-Agent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
  10.         "Connection":"keep-alive",
  11.         "Accept":"text/html,application/xhtml+xml,application/xml;q=8.9,image/avif.image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
  12.         "Accept-Encoding":"gzip,deflate",
  13.         "Host":"www.baidu.com",
  14.         "Cookie": "PSTM=1701005830; BIDUPSID=3847DE4A87F6BBA415E599085D83A664; BAIDUID=15153A5F7368E797908F9D80E823DA32:FG=1; BD_UPN=12314753; H_WISE_SIDS_BFESS=60360; MCITY=-360%3A; BDUSS=lrTlh4NTFOV2d2aVFDTWk0V20ySGNIZDJKT09QMFA0cHFyWkJ5QkxDZkZ1Y0ZtRVFBQUFBJCQAAAAAAAAAAAEAAAAPPSBIWW9ya19oYXBweQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMUsmmbFLJpmQ2; BDUSS_BFESS=lrTlh4NTFOV2d2aVFDTWk0V20ySGNIZDJKT09QMFA0cHFyWkJ5QkxDZkZ1Y0ZtRVFBQUFBJCQAAAAAAAAAAAEAAAAPPSBIWW9ya19oYXBweQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMUsmmbFLJpmQ2; H_PS_PSSID=60449_60359_60468_60440_60491_60501; H_WISE_SIDS=60449_60359_60468_60440_60491_60501; BAIDUID_BFESS=15153A5F7368E797908F9D80E823DA32:FG=1; BA_HECTOR=8lah8l8l05a12524ak20a5a1152kgl1j9ovqd1u; ZFY=wQT92WwXTov0LZiyOtHB0sWFAGuHJDp:BwvWiwRx018g:C; delPer=0; BD_CK_SAM=1; PSINO=1; BDRCVFR[K6RW1DeE3Dm]=mk3SLVN4HKm; BDORZ=FFFB88E999055A3F8A630C64834BD6D0; H_PS_645EC=41244eUtCO11J%2FCYVZbKoFXLf9Q%2B2xUUYIMe%2FpRqCMbzuDBa9I%2FRH69TQ6cCalLJyL%2F7ag"
  15.     }
  16. def search(v_keyword,v_result_file,v_max_pages):

  17.     for page in range(v_max_pages):
  18.         print("开始爬取第{}行".format(page+1))
  19.         wait_seconds = random.uniform(1,2)
  20.         print("开始等待{}行".format(wait_seconds))
  21.         sleep(wait_seconds)
  22.         url = 'https://www.baidu.com/s?wd='+ v_keyword+ '&pn=' + str(page * 10)
  23.         response = requests.get(url, headers=headers)
  24.         response.encoding = 'utf-8'
  25.         html = response.text
  26.         print("响应码是:{}",format(response.status_code))
  27.         print(response.text)
  28.         soup = BeautifulSoup(response.text, 'html.parser')
  29.         result_list = soup.find_all('div', class_='result c-container new-pmd')
  30.         print("正在爬取{},共查询到{}个结果".format(url,len(result_list)))
  31.         kw_list = []
  32.         page_list = []
  33.         title_list = []
  34.         href_list = []
  35.         realurl_list = []
  36.         desc_list = [] #简介
  37.         site_list = [] #网站名称
  38.         for result in result_list:
  39.             title = result.find("a").text
  40.             print("标题是",title)
  41.             href = result.find("a")['href']
  42.             realurl= get_real_url(v_url=href)
  43.             try:
  44.                 desc = result.find(class_='c-abstract').text
  45.             except:
  46.                 desc = ""
  47.             try:
  48.                 site = result.find(class_='c-showurl c-color-gray').text
  49.             except:
  50.                 site = ""
  51.             kw_list.append(v_keyword)
  52.             page_list.append(page+1)
  53.             title_list.append(title)
  54.             href_list.append(href)
  55.             realurl_list.append(realurl)
  56.             desc_list.append(desc)
  57.             site_list.append(site)
  58.         df = pd.DataFrame(
  59.             {
  60.                 '关键词':kw_list,
  61.                 '页码':page_list,
  62.                 '标题':title_list,
  63.                 '百度链接':href_list,
  64.                 '真实链接':realurl_list,
  65.                 '简介':desc_list,
  66.                 '网站名称':site_list,
  67.             }
  68.         )   
  69.         if os.path.exists(v_result_file):
  70.             header = None
  71.         else:
  72.             header = ['关键词','页码','标题','百度链接', '真实链接','简介','网站名称']
  73.         df.to_csv(v_result_file,mode="a+",index=False,header=header,encoding='utf_8_sig')
  74.         print("数据保存成功:{}".format(v_result_file))

  75. def get_real_url(v_url):
  76.     r = requests.get(v_url,headers=headers,allow_redirects=False)
  77.     if r.status_code == 382:
  78.         real_url = r.headers.get("location")
  79.     else:
  80.         real_url = re.findall("URL = '(.*?)'",r.text)[0]
  81.     print("real_url is :",real_url)
  82.     return real_url

  83. if __name__ == '__main__':
  84.     keyword = input("请输入关键词")
  85.     max_pages = 5
  86.     result_file = "爬取{}前{}页.csv".format(keyword,max_pages)
  87.     if os.path.exists(result_file):
  88.         os.remove(result_file)
  89.         print("该爬取关键词存在已被删除")
  90.    
  91. search(v_keyword=keyword,v_result_file=result_file,v_max_pages=max_pages)


复制代码

本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2024-7-21 11:49:38 | 显示全部楼层
嘿,鱼油!看你的代码,简直就像个士兵在执行任务,可以爬取百度搜索结果,但是它出现了一些“小错误”,导致结果显示为0。咱们来逐步分析并修复它,好吗?

1. **问题归类**:
   - 缺少初始化列表。
   - 错误的字符串格式化。
   - 百度网页结构变化,选择器选择不到元素。
   - 获取真实 URL 的逻辑可能有问题。

2. **逐项解决**:

首先,我们要确保定义初始的空列表。如果没有这些空列表,代码在赋值时就会报错。

然后,把字符串格式化的问题解决一下,`format`函数用法稍有不正确。

**Here's the fixed code:**

  1. import requests
  2. from bs4 import BeautifulSoup
  3. import pandas as pd
  4. from time import sleep
  5. import re
  6. import random
  7. import os

  8. headers = {
  9.         "User-Agent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
  10.         "Connection":"keep-alive",
  11.         "Accept":"text/html,application/xhtml+xml,application/xml;q=8.9,image/avif.image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
  12.         "Accept-Encoding":"gzip,deflate",
  13.         "Host":"www.baidu.com",
  14.         "Cookie": "PSTM=1701005830; BIDUPSID=3847DE4A87F6BBA415E599085D83A664; BAIDUID=15153A5F7368E797908F9D80E823DA32:FG=1; BD_UPN=12314753; H_WISE_SIDS_BFESS=60360; MCITY=-360%3A; BDUSS=lrTlh4NTFOV2d2aVFDTWk0V20ySGNIZDJKT09QMFA0cHFyWkJ5QkxDZkZ1Y0ZtRVFBQUFBJCQAAAAAAAAAAAEAAAAPPSBIWW9ya19oYXBweQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMUsmmbFLJpmQ2; BDUSS_BFESS=lrTlh4NTFOV2d2aVFDTWk0V20ySGNIZDJKT09QMFA0cHFyWkJ5QkxDZkZ1Y0ZtRVFBQUFBJCQAAAAAAAAAAAEAAAAPPSBIWW9ya19oYXBweQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMUsmmbFLJpmQ2; H_PS_PSSID=60449_60359_60468_60440_60491_60501; H_WISE_SIDS=60449_60359_60468_60440_60491_60501; BAIDUID_BFESS=15153A5F7368E797908F9D80E823DA32:FG=1; BA_HECTOR=8lah8l8l05a12524ak20a5a1152kgl1j9ovqd1u; ZFY=wQT92WwXTov0LZiyOtHB0sWFAGuHJDp:BwvWiwRx018g:C; delPer=0; BD_CK_SAM=1; PSINO=1; BDRCVFR=mk3SLVN4HKm; BDORZ=FFFB88E999055A3F8A630C64834BD6D0; H_PS_645EC=41244eUtCO11J%2FCYVZbKoFXLf9Q%2B2xUUYIMe%2FpRqCMbzuDBa9I%2FRH69TQ6cCalLJyL%2F7ag"
  15.     }

  16. def search(v_keyword,v_result_file,v_max_pages):
  17.     # 定义这些变量为list类型
  18.     kw_list = []
  19.     page_list = []
  20.     title_list = []
  21.     href_list = []
  22.     realurl_list = []
  23.     desc_list = []
  24.     site_list = []

  25.     for page in range(v_max_pages):
  26.         print("开始爬取第{}行".format(page+1))
  27.         wait_seconds = random.uniform(1,2)
  28.         print("开始等待{}秒".format(wait_seconds))
  29.         sleep(wait_seconds)
  30.         url = 'https://www.baidu.com/s?wd='+ v_keyword+ '&pn=' + str(page * 10)
  31.         response = requests.get(url, headers=headers)
  32.         response.encoding = 'utf-8'
  33.         html = response.text
  34.         print("响应码是: {}".format(response.status_code))
  35.         soup = BeautifulSoup(response.text, 'html.parser')
  36.         
  37.         result_list = soup.find_all('div', class_='c-container')
  38.         print("正在爬取{},共查询到{}个结果".format(url,len(result_list)))

  39.         for result in result_list:
  40.             title = result.find("a").text
  41.             print("标题是",title)
  42.             href = result.find("a").get('href')
  43.             realurl = get_real_url(v_url=href)
  44.             try:
  45.                 desc = result.find(class_='c-abstract').text
  46.             except:
  47.                 desc = ""
  48.             try:
  49.                 site = result.find(class_='c-showurl').text
  50.             except:
  51.                 site = ""
  52.             
  53.             kw_list.append(v_keyword)
  54.             page_list.append(page+1)
  55.             title_list.append(title)
  56.             href_list.append(href)
  57.             realurl_list.append(realurl)
  58.             desc_list.append(desc)
  59.             site_list.append(site)
  60.         
  61.         df = pd.DataFrame(
  62.             {
  63.                 '关键词':kw_list,
  64.                 '页码':page_list,
  65.                 '标题':title_list,
  66.                 '百度链接':href_list,
  67.                 '真实链接':realurl_list,
  68.                 '简介':desc_list,
  69.                 '网站名称':site_list,
  70.             }
  71.         )   
  72.         if os.path.exists(v_result_file):
  73.             header = None
  74.         else:
  75.             header = True
  76.         df.to_csv(v_result_file,mode="a+",index=False,header=header,encoding='utf_8_sig')
  77.         print("数据保存成功:{}".format(v_result_file))

  78. def get_real_url(v_url):
  79.     r = requests.get(v_url,headers=headers,allow_redirects=False)
  80.     if r.status_code == 302:
  81.         real_url = r.headers.get("location")
  82.     else:
  83.         real_url = re.findall("URL = '(.*?)'",r.text)
  84.     print("real_url is :",real_url)
  85.     return real_url

  86. if __name__ == '__main__':
  87.     keyword = input("请输入关键词:")
  88.     max_pages = 5
  89.     result_file = "爬取{}前{}页.csv".format(keyword,max_pages)
  90.     if os.path.exists(result_file):
  91.         os.remove(result_file)
  92.         print("该爬取关键词存在已被删除")
  93.    
  94.     search(v_keyword=keyword,v_result_file=result_file,v_max_pages=max_pages)
复制代码


### 主要修正点:

1. **初始化列表**:确保 `kw_list`、`page_list` 等在函数内部开始处被定义。
2. **格式化字符串**:修正了 `.format()` 用法。
3. **选择器适配**:百度页面的 HTML 结构可能变了,所以你需要检查使用的选择器。
4. **获取真实 URL**:修正了应对重定向的状态码,将 `382` 修改为 `302`。

试试这个修改后的代码,应该能有所改进。如果还有问题,欢迎继续提问!祝你爬虫愉快,别让百度认为你是个“怪蜀黍”哦!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-21 14:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表