目录

概述

准备

所需模块

涉及知识点

运行效果

完成爬虫

1. 分析网页

2. 爬虫代码

3. 完整爬虫

4. 整理总结


概述

下载百度贴吧的网页。

准备

所需模块

  • time
  • urllib.parse
  • urllib.request

涉及知识点

  • python基础
  • 前端基础
  • urllib模块基础

运行效果

控制台打印:

Python爬论坛帖子 python爬虫百度贴吧_python

电脑本地文件:

Python爬论坛帖子 python爬虫百度贴吧_python_02

打开其中之一的文件浏览:

Python爬论坛帖子 python爬虫百度贴吧_Python爬论坛帖子_03

完成爬虫

1. 分析网页

打开百度贴吧搜索一个关键字,这里示例的是python,也可以是其他关键字(即百度贴吧的吧名)

Python爬论坛帖子 python爬虫百度贴吧_python_04

打开后查看网址是如此(这也是第一页):http://tieba.baidu.com/f?ie=utf-8&kw=python&fr=search&red_tag=p0715929510

Python爬论坛帖子 python爬虫百度贴吧_爬虫实战_05

浏览到页面最下方,跳转到第二页,

注意地址变成了:http://tieba.baidu.com/f?kw=python&ie=utf-8&pn=50,和第一页的网址差别很大,几乎没有联系

Python爬论坛帖子 python爬虫百度贴吧_python爬虫_06

继续,跳转到第三页,查看网址:http://tieba.baidu.com/f?kw=python&ie=utf-8&pn=100,和第二页的网址相似,唯一的区别就是pn这个参数的值不一样

Python爬论坛帖子 python爬虫百度贴吧_贴吧_07

这次,点击1,跳转到第一页,查看网址:http://tieba.baidu.com/f?kw=python&ie=utf-8&pn=0,和第二页及第三页的网址类似,这也是第一页的网址,上面哪个也是第一页的。

Python爬论坛帖子 python爬虫百度贴吧_爬虫实战_08

现在把第1、2、3的页网址放在一起比较:

# 第1页:http://tieba.baidu.com/f?kw=python&ie=utf-8&pn=0
# 第2页:http://tieba.baidu.com/f?kw=python&ie=utf-8&pn=50
# 第3页:http://tieba.baidu.com/f?kw=python&ie=utf-8&pn=100
# 比较三者三者可以得出每一页的网址公式:
# "http://tieba.baidu.com/f?kw="+tieba_name+"&ie=utf-8&pn="+(page_index-1)*50
# 其中tieba_name是你要搜索的贴吧名字,page_index是你要搜索的第几页

得出如上的结论

使用如下代码测试分析得出的URL

tieba_name="java"# 搜索的贴吧名字叫做java
page_index=5# 查询第5页的网址
url="http://tieba.baidu.com/f?kw="+tieba_name+"&ie=utf-8&pn="+str((page_index-1)*50)# 组装URL
print(url)# 打印URL

打印结果如下:

http://tieba.baidu.com/f?kw=java&ie=utf-8&pn=200

访问地址结果如下:

Python爬论坛帖子 python爬虫百度贴吧_Python爬论坛帖子_09

2. 爬虫代码

接下来就是写爬虫代码了

基本读取HTML页面源代码功能实现了,具体代码如下:

import urllib.parse
import urllib.request

# 百度贴吧网页下载

# 构造请求头信息
header = {
    # 这里的User-Agent是用的谷歌浏览器的
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.81 Safari/537.36"
}

tieba_name = "python"  # 自定义贴吧名为python
start_page = 1  # 自定义开始页为第1页
end_page = 3  # 自定义结束页为第3页
key = urllib.parse.urlencode({"kw": tieba_name})  # 处理贴吧名是中文的问题,如果是英文就不需要编码
url1 = "http://tieba.baidu.com/f?" + key + "&ie=utf-8&pn=" + str((1 - 1) * 50)  # 第1页的网址
url2 = "http://tieba.baidu.com/f?" + key + "&ie=utf-8&pn=" + str((2 - 1) * 50)  # 第2页的网址
url3 = "http://tieba.baidu.com/f?" + key + "&ie=utf-8&pn=" + str((3 - 1) * 50)  # 第3页的网址
req = urllib.request.Request(url1, headers=header)  # 获取request对象。url1是要请求的第一页的URL,headers是需要的头信息
response = urllib.request.urlopen(req).read()  # 发送请求,获取响应
print(response)# 打印HTML源代码

打印如下:

Python爬论坛帖子 python爬虫百度贴吧_python爬虫_10

获取user-agent:

Python爬论坛帖子 python爬虫百度贴吧_爬虫实战_11

3. 完整爬虫

import urllib.parse
import urllib.request

# 百度贴吧网页下载

# 构造请求头信息
header = {
    # 这里的User-Agent是用的谷歌浏览器的
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.81 Safari/537.36"
}

tieba_name = "python"  # 自定义贴吧名为python
start_page = 1  # 自定义开始页为第1页
end_page = 3  # 自定义结束页为第3页
key = urllib.parse.urlencode({"kw": tieba_name})  # 处理贴吧名是中文的问题,如果是英文就不需要编码
for i in range(start_page, end_page + 1):  # 循环遍历下载前三页的百度贴吧网页
    file_name = "C:/第" + str(i) + "页.html"  # 要写入的文件的文件名
    url = "http://tieba.baidu.com/f?" + key + "&ie=utf-8&pn=" + str((i - 1) * 50)  # 第i页的网址
    req = urllib.request.Request(url, headers=header)  # 获取request对象。url1是要请求的第一页的URL,headers是需要的头信息
    response = urllib.request.urlopen(req).read()  # 发送请求,获取响应
    with open(file_name, "wb") as file_object:  # "wb"指的是以二进制形式写入
        file_object.write(response)  # 写入文件

在C盘查看下载文件:

Python爬论坛帖子 python爬虫百度贴吧_Python爬论坛帖子_12

打开第1页查看源码:

Python爬论坛帖子 python爬虫百度贴吧_python爬虫_13

4. 整理总结

整理总结后的代码如下:

import time
import urllib.parse
import urllib.request

# 百度贴吧网页下载

# 分析网页
# 第1页:http://tieba.baidu.com/f?kw=python&ie=utf-8&pn=0
# 第2页:http://tieba.baidu.com/f?kw=python&ie=utf-8&pn=50
# 第3页:http://tieba.baidu.com/f?kw=python&ie=utf-8&pn=100
# 比较三者三者可以得出每一页的网址公式:
# "http://tieba.baidu.com/f?kw="+tieba_name+"&ie=utf-8&pn="+(page_index-1)*50
# 其中tieba_name是你要搜索的贴吧名字,page_index是你要搜索的第几页

# 构造请求头信息
header = {
    # 这里的User-Agent是用的谷歌浏览器的
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.81 Safari/537.36"
}


def load_page(full_url, file_name):
    """根据url用爬虫爬取网页信息"""
    print("正在下载:", file_name, "...")
    req = urllib.request.Request(full_url, headers=header)
    response = urllib.request.urlopen(req).read()
    return response  # 返回二进制的HTML信息


def write_page(html, file_name):
    """根据获取的二进制的HTML信息保存到电脑本地"""
    print("正在保存:", file_name, "...")

    with open(file_name, "wb") as file_object:  # 以二进制形式写入
        file_object.write(html)

    print("------------------------------")


def tieba_spider(url, start, end):
    """贴吧爬虫,循环下载指定页的网页"""
    for page_index in range(start, end + 1):
        pn = (page_index - 1) * 50  # 计算URL中pn参数的值
        full_url = url + "&ie=utf-8&pn=" + str(pn)  # 每次请求的完整URL
        print("URL:", full_url)
        file_name = "C:/第" + str(page_index) + "页.html"  # 每次请求后保存的文件名

        html = load_page(full_url, file_name)  # 调用爬虫,爬取网页
        write_page(html, file_name)  # 把爬取到的网页信息写入到本地


# 主方法
if __name__ == '__main__':
    tieba_name = input("请输入贴吧名:")
    start_page = int(input("请输入起始页:"))
    end_page = int(input("请输入结束页:"))

    url = "http://tieba.baidu.com/f?"
    key = urllib.parse.urlencode({"kw": tieba_name})  # 对中文进行编码,其中键名必须是kw,是访问的URL的参数名
    url = url + key
    tieba_spider(url, start_page, end_page)
    time.sleep(100)

运行代码的结果如上面效果展示的一样

这是第一个python爬虫,也是最简单的爬虫。