目录
概述
爬取百度贴吧每个帖子中的所有图片。
准备
所需模块
- urllib.parse
- urllib.request
- lxml
涉及知识点
- python基础
- requests模块基础
- xpath表达式基础
运行效果
控制台打印:
电脑本地文件:
完成爬虫
1. 分析网页
打开百度贴吧搜索一个关键字,这里示例的是python,也可以是其他关键字
分析前三页的URL,得出:
# 第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后,接着就是分析具体一页中各个帖子的链接:
前面已经可以通过页面的URL请求源码,在源码中可以通过xpath表达式进行提取这串数字然后组装具体帖子页面的URL。
点击帖子,进入到具体的页面后,请求源码然后提取图片的链接:
思路如此:
先根据贴吧名称获取贴吧的URL,然后组装每一页的URL,再根据每一页的URL请求该页的HTML源码,然后提取源码中每一个帖子的超链接信息,然后组装每一个帖子具体页面的URL,然后请求帖子具体页面的HMTL源码,再提取其中的图片超链接,然后根据图片的超链接进行下载图片。
2. 爬虫代码
import urllib.parse
import urllib.request
from lxml import etree
# 爬虫实践:爬取百度贴吧的图片
class Spider():
def __init__(self):
self.tiebaName = "java"
self.pageNumber = 3
self.url = "http://tieba.baidu.com/f?"
self.fileName = 1
def tiebaSpider(self):
"""构造URL"""
for page_index in range(1, self.pageNumber + 1):
pn = (page_index - 1) * 50
wo = {"pn": pn, "kw": self.tiebaName}
word = urllib.parse.urlencode(wo)
tieba_url = self.url + word
self.loadPage(tieba_url)
def loadPage(self, url):
"""爬取页面内容"""
req = urllib.request.Request(url)
data = urllib.request.urlopen(req).read()
html = etree.HTML(data)
links = html.xpath("//div[@class='threadlist_lz clearfix']/div/a/@href")
for link in links:
link = "http://tieba.baidu.com" + link
self.loadImages(link)
def loadImages(self, link):
"""爬取帖子详情页,获得图片的链接"""
req = urllib.request.Request(link)
data = urllib.request.urlopen(req).read()
html = etree.HTML(data)
links = html.xpath("//img[@class='BDE_Image']/@src")
for image_link in links:
self.writeImages(image_link)
def writeImages(self, imageslink):
"""通过图片的链接,爬取图片并保存在本地"""
print("正在存储图片:", self.fileName, "......")
image = urllib.request.urlopen(imageslink).read()
file = open(r"C:\\Users\\Administrator\\Pictures\\img\\" + str(self.fileName) + ".jpg", "wb")
file.write(image)
file.close()
self.fileName += 1
if __name__ == '__main__':
# 实例化Spider类
mySpider = Spider()
# 调用方法
mySpider.tiebaSpider()