吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2875|回复: 17
收起左侧

[Python 转载] python爬虫之爬取百度搜索结果页面URL以及名称

[复制链接]
大白baymax 发表于 2025-4-24 17:08
本帖最后由 大白baymax 于 2025-4-24 17:18 编辑

话不多说直接上代码:
[Python] 纯文本查看 复制代码
import requests
from bs4 import BeautifulSoup
import re
import time
from random import choic[attach]2773421[/attach]e

# 创建headers字段
def createUA():
    # 运行该程序前:请打开浏览器前往"https://www.baidu.com"手动登录自己的百度账户,按F12打开开发者模式,选择最上面一排Network/网络选项卡
    # 接着按F5刷新本网页,捕获到的请求里一直往上翻到最顶端,选择第一次请求(即名称为[url=http://www.baidu.com]www.baidu.com[/url]的请求)。
    # 再选择右侧标头选项卡,往下滑到请求标头处,将Cookie字段的值全部复制下来(有很长一段的)替换掉下行的****** 替换后可直接运行该文件
    ua = {'Cookie': '******', \
    'Host': 'www.baidu.com', \
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36 Edg/111.0.1661.54'}
    return ua
    # 程序运行无数据返回爬不了的时候,浏览器直接刷新继续按上述方法换字典里的Cookie值就完事了

# 将百度搜索链接给予的加密URL转化为真实的URL
def convertRealUrl(url, s2):
    try:
        headers = createUA()
        realR = s2.get(url = url, headers = headers, allow_redirects = False)
        # 当请求加密链接,初两次响应的Http报文往往告知浏览器需要重定向,最初两次的响应报文里才有Location属性来告知浏览器需要重定向到的真实网站链接。
        # 此时我们不允许会话自动根据给出的Location重定向跳转,因为允许重定向后会自动跳到最新的真实的URL站点,这时就只返回最新站点的响应HTTP报文(已完成重定向后),此时响应标头里不再有指示重定向url的Location字段。此方法就会失效!
        return realR.headers['Location']
    except:
        # print(realR.status_code, end = "")
        print("头部字段没有Location属性或者加密的url有异常")
        return url# 如果找不到Location头部字段无法返回真实链接,那么就返回原来的加密链接

# 获取搜索页
def getSearchPage(keyword, pn, s1):
    headers = createUA()
    url = 'http://www.baidu.com/s'
    payload = {'wd': keyword, 'pn': pn}
    try:
        r = s1.get(url, headers = headers, params = payload, timeout = 30)
        print('状态码是:', r.status_code)
        r.raise_for_status()
        r.encoding = 'utf-8'
        return r.text
    except:
        return "状态码异常"

# 升级!爬取一页的标题和真实链接
def upgradeCrawler(html, s2):
    soup = BeautifulSoup(html, 'lxml')
    titles = []
    links = []
    for h3 in soup.find_all('h3', {'class': re.compile('c-title t')}):
        # a.text为获取该路径下所有子孙字符串吧。可能刚好a元素和em元素间没有换行符,所以抓取的字符串里没有\n换行符
        g_title = h3.a.text.replace('\n', '').replace(',', ' ').strip()# 去掉换行和空格,部分标题中还有逗号会影响CSV格式存储,也要去除。
        g_url = h3.a.attrs['href']
        g_url = convertRealUrl(g_url, s2)
        print("{}\t{}\t".format(g_title, g_url))
        titles.append(g_title)
        links.append(g_url)
    return titles, links

# 将二维列表数据写入CSV文件
def writeCSV(titles, links):
    infos = list(zip(titles, links))
    fo = open('./BDlinks.csv', 'at', encoding='utf-8')# 需要锁定用utf-8编码打开,不然该文件很可能会以gbk中文编码存储,这导致部分url中的西文字符存储到本文件时无法通过gbk模式编码存储。
    for row in infos:
        fo.write(",".join(row) + "\n")
    fo.close()
    print("CSV文件已保存!")

# 顶层设计
def main():
    while True:  # 循环
        keyword = input("请输入搜索关键词:")
        num = int(input("请输入爬取页数:"))
        titles = []
        links = []
        # s1会话用于获取搜索结果页
        s1 = requests.session()
        # s2会话用于转真实URL
        s2 = requests.session()
        # 第1页为0,第2页为10,第3页为20,依次类推
        num = num * 10
        for pn in range(0, num, 10):
            html = getSearchPage(keyword, pn, s1)
            print('标题\tURL\t')
            ti, li = upgradeCrawler(html, s2)
            titles += ti
            links += li
            print("{0:->41}{1:-<36.0f}".format("当前页码为:", pn / 10 + 1))
            time.sleep(5)
        print('爬取完成!')
        writeCSV(titles, links)

# 代码不要强求都封装成函数,这样会让传参(变量作用域)变得十分复杂和麻烦!也会增加代码行数!而且有些部分从整体意义上就是不好分的!

if __name__ == '__main__':
    main()


使用方法:
步骤1.png 步骤2.png 步骤3.png 步骤4.png 步骤5.png 步骤6.png 步骤7.png 爬取数据结果展示.png




最后保存成CSV文件即可。

免费评分

参与人数 1吾爱币 +7 热心值 +1 收起 理由
苏紫方璇 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

ruanxiaoqi 发表于 2025-4-30 09:55
from random import choice 这行代码是不是有点问题,运行时出现问题,如何解决?
Hades5 发表于 2025-4-24 17:26
mw26973 发表于 2025-4-24 17:34
Luce 发表于 2025-4-24 19:02
不错不错,感谢分享
BTCQAQ 发表于 2025-4-24 19:14
感谢楼主分享
agriculture 发表于 2025-4-24 19:30

感谢楼主分享
bujimo3 发表于 2025-4-24 19:56
向大佬学习了
wapj53 发表于 2025-4-24 20:06
学习一下
YXR20061105 发表于 2025-4-24 20:51
好像可以先自行访问一次百度,就能获取到返回的cookie,下次请求直接用就行了
8204118 发表于 2025-4-24 23:34
感觉没什么作用
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - 52pojie.cn ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2026-6-10 08:35

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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