① 提示用户输入要爬取的爬取名,以及要查询的起始页和结束页。然后,使用 urllib.parse.urlencode() 对 url 参数进行转码,组合成一个完整的可访问的 URL。
if __name__ == "__main__":
kw = input("请输入要爬取的贴吧名:")
begin_page = int(input("请输入起始页:"))
end_page = int(input("请输入结束页:"))
url = "https://tieba.baidu.com/f?"
key = urllib.parse.urlencode({"kw": kw})
url = url + key
tieba_spider(url, begin_page, end_page)
② 用于爬取百度贴吧的函数,该函数需要传递3个参数,分别是 URL 地址,表示爬取页码范围的起始页码和终止页码。
def tieba_spider(url, begin_page, end_page):
'''
贴吧爬虫调度器,负责组合处理每个页面的 url
url:贴吧 url 的前半部分
begin_page:起始页码
end_page:结束页
'''
for page in range(begin_page, end_page + 1):
pn = (page - 1) * 50
file_name = "第" + str(page) + "页.html"
full_url = url + "&ie=utf-8&pn=" + str(pn)
html = load_page(full_url, file_name)
write_page(html, file_name)
③ 实现爬取功能的函数,构造一个 Request 对象,然后使用 urllib.request.urlopen 爬取网页,返回响应内容。
def load_page(url, filename):
'''
根据 url 发送请求,获取服务器响应文件
url:需要爬取的 url 地址
'''
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36"}
request = urllib.request.Request(url, headers=headers)
return urllib.request.urlopen(request).read()
④ 存储文件的函数,将爬取到的每页信息存储在本地文件。
def write_page(html, filename):
'''
将 html 内容写入本地文件
html:服务器响应文件内容
'''
print("正在保存" + filename)
with open(filename, 'w', encoding="utf-8") as file:
file.write(html.decode("utf-8"))
运行程序,按照提示输入贴吧名称以及要爬取的起始页和结束页。