图片网站数据采集

本文介绍如何使用Python从指定网站抓取非结构化数据,特别是图片,通过requests库获取HTML,解析图片URL,利用线程实现多线程下载图片。作者提供了完整的代码示例,包括使用fake_useragent库生成随机User-Agent和使用lxml库处理HTML。
摘要由CSDN通过智能技术生成

本文主要是学习如何采集非结构化的数据,图片。

说明:代码仅供学习,并非其他用途。

这样我们看到想要的图片,就能拿下,看到想要的美女图片,直接拿下好吧!

废话不多说,直接上代码。

第一步:确定图片的网址

这里我选择的是

https://sc.chinaz.com/tupian/

然后点击选择自己喜欢的类别(人物图片)【狗头保命】,把把网址拿下。

https://sc.chinaz.com/tupian/renwutupian.html

第二步:获取每张图片的地址

这个网址下面解析的内容是解析不到图片的数据的,只能解析到图片所在的地址。

通过requests.get请求方法获得这个网址的HTML,然后通过开发者选项查看网页每张图片的元素div标签位置。

找到所有图片所在的HTML标签位置,然后再解析每张图片所在标签位置的href属性获取图片的地址

这里有个坑,就是获取的href属性值并不是图片实际的地址,只是图片详情页面所在的网址,所以,这里我就直接去img标签下的data-original属性,src属性也是可以的,这样就获得了一张图片的url地址了,其他图片的地址用相同的方法获取url。

代码:

response = requests.get("https://sc.chinaz.com/tupian/jianzhutupian.html", headers="请求头,就是user-agent")
response.encoding = "utf-8"
html = response.content
tree = etree.HTML(html)
divs = tree.xpath('/html/body/div[3]/div[2]/div')
url_list = []
for div in divs:
   href = 'https:' + div.xpath('./img/@data-original')[0]
   title = div.xpath('./img/@alt')[0]
   url_list.append({"href": href, "title": title})

print(url_list)

代码的请求头就用你自己的电脑的吧,这里就没写了【狗头】地址用地点保存到列表里面了。

第三步:获取图片并保存

同样使用requests.get()方法获取图片地址的二进制数据,然后保存到自己的图片目录下

for item in url_list:
    url = item['url']
    title = item['title']
    response = requests.get(url, headers=self.headers)
    response.encoding = "utf-8"
    with open("./picture/{}.jpg".format(title), "wb") as f:
        f.write(response.content)
        print(f"{url}下载完成")

这里图片量比较大的时候,解析时间较长,所以我就使用了线程获取图片并保存图片,并对上面的代码进行了封装,这里的请求头,我使用了fake_useragent第三方库生成的请求头,命令行需要执行pip install fake_useragent 一下就可以了。

线程知识,我使用了threading,大家也可以pip install threading一下就可以了,threading下的Thread方法,这个方法传入的参数是执行的函数名target,和函数需要传入的参数args(按顺序写),然后遍历线程,进行回收线程。

# 多线程爬取图片
for picture_url in self.picture_urls:
    task = threading.Thread(target=self.get_picture, args=(picture_url['href'], picture_url['title']))
    task.start()

# 等待线程完成
for t in threading.enumerate():
    task.join()

图片数据采集如上,一起进步,一起学习鸭!有什么错误或疑问,望评论区交流或私聊我呀。

详细的如下

完整代码:

import threading
import requests
from lxml import etree
from fake_useragent import UserAgent


class PictureCrawler():
    def __init__(self, url):
        self.url = url
        self.ua = UserAgent()
        self.headers = {
            "User-Agent": self.ua.random
        }
        self.picture_urls = []

    # 获取图片的url
    def get_picture_url(self):
        response = requests.get(self.url, headers=self.headers)
        response.encoding = "utf-8"
        html = response.content
        tree = etree.HTML(html)
        divs = tree.xpath('/html/body/div[3]/div[2]/div')
        for div in divs:
            href = 'https:' + div.xpath('./img/@data-original')[0]
            title = div.xpath('./img/@alt')[0]
            self.picture_urls.append({"href": href, "title": title})
            # print(href, title)

    # 获取图片并保存
    def get_picture(self, url, title):
        response = requests.get(url, headers=self.headers)
        response.encoding = "utf-8"
        with open("./picture/{}.jpg".format(title), "wb") as f:
            f.write(response.content)
        print(f"{url}下载完成")

    # 运行方法
    def run(self):
        self.get_picture_url()
        # 多线程爬取图片
        for picture_url in self.picture_urls:
            task = threading.Thread(target=self.get_picture, args=(picture_url['href'], picture_url['title']))
            task.start()

        # 等待线程完成
        for t in threading.enumerate():
            task.join()


if __name__ == '__main__':
    url = 'https://sc.chinaz.com/tupian/jianzhutupian.html'
    task = PictureCrawler(url)
    task.run()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

瑶瑶瑶领先

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值