python爬虫实践之爬取百度贴吧的图片

目录

概述

准备

所需模块

涉及知识点

运行效果

完成爬虫

1. 分析网页

2. 爬虫代码


概述

爬取百度贴吧每个帖子中的所有图片。

准备

所需模块

  • 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()

 

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值