目录
概述
准备
所需模块
涉及知识点
运行效果
完成爬虫
1. 分析网页
2. 爬虫代码
3. 完整爬虫
4. 整理总结
概述
下载百度贴吧的网页。
准备
所需模块
- time
- urllib.parse
- urllib.request
涉及知识点
- python基础
- 前端基础
- urllib模块基础
运行效果
控制台打印:
电脑本地文件:
打开其中之一的文件浏览:
完成爬虫
1. 分析网页
打开百度贴吧搜索一个关键字,这里示例的是python,也可以是其他关键字(即百度贴吧的吧名)
打开后查看网址是如此(这也是第一页):http://tieba.baidu.com/f?ie=utf-8&kw=python&fr=search&red_tag=p0715929510
浏览到页面最下方,跳转到第二页,
注意地址变成了:http://tieba.baidu.com/f?kw=python&ie=utf-8&pn=50,和第一页的网址差别很大,几乎没有联系
继续,跳转到第三页,查看网址:http://tieba.baidu.com/f?kw=python&ie=utf-8&pn=100,和第二页的网址相似,唯一的区别就是pn这个参数的值不一样
这次,点击1,跳转到第一页,查看网址:http://tieba.baidu.com/f?kw=python&ie=utf-8&pn=0,和第二页及第三页的网址类似,这也是第一页的网址,上面哪个也是第一页的。
现在把第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
访问地址结果如下:
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源代码
打印如下:
获取user-agent:
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盘查看下载文件:
打开第1页查看源码:
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爬虫,也是最简单的爬虫。