Python爬取百度搜索结果页的站名、网页标题和真实网址

本程序需要提前安装的第三方库:requests和bs4库
cmd命令行输入安装requests库:pip3 install -i https://pypi.douban.com/simple requests
安装bs4库:pip3 install -i https://pypi.douban.com/simple beautifulsoup4

步骤:
1、接着按F5刷新本网页,捕获到的请求里一直往上翻到最顶端,选择第一次请求(即名称为www.baidu.com的请求)。
在这里插入图片描述
2、再选择右侧标头选项卡,往下滑到请求标头处,将Cookie字段的值全部复制下来(有很长一段的)替换掉下行的****** 替换后可直接运行该文件。
在这里插入图片描述在这里插入图片描述在这里插入图片描述
3、按上述步骤装载完Cookie后记得保存py脚本文件,就可以运行该脚本了。下图这里我用的是Vscode编译器来跑脚本。
在这里插入图片描述
4、找到保存结果的xxx.csv文件后,可用WPS、微软Excel等软件直接打开。
在这里插入图片描述
如若该py脚本首次运行就失败,运行后无数据打印出来,一般是未成功装载Cookie的问题,请按开头的步骤重新装载Cookie。

如若该py脚本多次运行后突然无数据打印出来,一般是 “高频访问百度服务器/被识别爬虫” 导致无数据返回,通常解决方法为换新Cookie:浏览器F5刷新后继续按按开头的步骤重新装载Cookie。

import requests
from bs4 import BeautifulSoup
import re
import time
from random import choice
import csv

def createUA():
    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

# 将百度搜索链接给予的加密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("头部字段没有Location属性或者加密的url有异常")
        return url

# 获取搜索页
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 = []
    scname = []
    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()
        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)
    
    result_list_0 = soup.find_all(class_='result c-container new-pmd')
    result_list_1 = soup.find_all(class_='result c-container xpath-log new-pmd')
    result_list = result_list_0 + result_list_1
    for result in result_list:
        try:
            site = result.find(class_="c-color-gray").text
            scname.append(site)
        except:
            site = ""
    return titles, links, scname

# 将二维列表数据写入CSV文件
def writeCSV(scnames, titles, links):
    infos = list(zip(scnames, titles, links))
    filename = './xxx.csv'  # 文件路径
    try:
        with open(filename, 'at', newline='') as csvfile:
            writer = csv.writer(csvfile)
            for row in infos:
                writer.writerow(row)
        print("CSV文件已保存到:", filename)
    except Exception as e:
        print("写入CSV文件时发生错误:", str(e))


def main():
    while True:
        keyword = input("请输入搜索关键词:")
        num = int(input("请输入爬取页数:"))
        titles = []
        links = []
        scnames = []
        s1 = requests.session()
        s2 = requests.session()
        num = num * 10
        for pn in range(0, num, 10):
            html = getSearchPage(keyword, pn, s1)
            print('标题\tURL\t')
            ti, li, na = upgradeCrawler(html, s2)
            titles += ti
            links += li
            scnames += na
            print("{0:->41}{1:-<36.0f}".format("当前页码为:", pn / 10 + 1))
            time.sleep(5)
        print('爬取完成!')
        writeCSV(scnames, titles, links)

if __name__ == '__main__':
    main()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

金科铁码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值
>