专题07-python使用urllib.request爬取图片

笔者是一个痴迷于挖掘数据中的价值的学习人,希望在平日的工作学习中,挖掘数据的价值,找寻数据的秘密,笔者认为,数据的价值不仅仅只体现在企业中,个人也可以体会到数据的魅力,用技术力量探索行为密码,让大数据助跑每一个人,欢迎直筒们关注我的公众号,大家一起讨论数据中的那些有趣的事情。

我的公众号为:livandata

python在爬虫方面的应用非常灵活,几乎可以解决大部分数据获取问题,笔者在之前也整理过几篇爬虫方面的博文:

1、基础结构:

https://blog.csdn.net/livan1234/article/details/80850555

2、scrapy框架:

https://blog.csdn.net/livan1234/article/details/80850926

3、cookie模拟登陆:

https://blog.csdn.net/livan1234/article/details/80850966

4、手机app爬取:

https://blog.csdn.net/livan1234/article/details/80850978

5、使用PhantomJS爬取

https://blog.csdn.net/livan1234/article/details/80851135

近期在整理图片和文字爬取时,遇到一些有意思的内容,也作为一个实践汇总,供大家参考:

(一)在图片爬取过程中经常会遇到“反盗链”问题,即请求资源时需要先加入一些请求头或者参数,即headers和data,

如图即为“开发者工具”中看到的request header,“反盗链”的解决方案就是找到request header中哪些字段需要添加到代码的请求头中。

常用的方法有两个,见下面的代码:

#!/usr/bin/env python
# _*_ UTF-8 _*_

import urllib.request
import ssl
import requests
from urllib import request, parse

ssl._create_default_https_context = ssl._create_unverified_context

# 获取网页的内容
def url_open(url):
    req = urllib.request.Request(url)
    req.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.65 Safari/537.36')
    req.add_header('Referer', 'XXXXXXMMMMMMMMMMMMMMM')
    response = urllib.request.urlopen(req, data=None)
    html = response.read()
    return html

def pic_open(url):
    headers = {
        "User-Agent": 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.65 Safari/537.36',
        # "host": 'www.eeeeee.com',
        "Referer": 'XXXXXXMMMMMMMMMMMMMMM'
    }
    # dict = {
    #     "name": "Germey"
    # }
    # data = bytes(parse.urlencode(dict), encoding="utf8")
    req = request.Request(url=url, data=None, headers=headers, method="GET")
    response = request.urlopen(req)
    pic = response.read()
    return pic

pic_url = 'https://VvVVVVVVXXXX.jpg'
with open('pic_.jpg', 'wb') as f:
    img = url_open(pic_url)
    print(img)
    f.write(img)
    f.close()

上面为常见的图片下载器。

(二)小说下载,有些连载的小说由于存在广告,使阅读的效用较小,因此需要将小说下载下来,此时,爬虫就是一个很好的选择,见代码:

#!/usr/bin/env python
# _*_ UTF-8 _*_

import urllib.request
from lxml import etree
import ssl
import time

ssl._create_default_https_context = ssl._create_unverified_context

url_total = []
context2 = ''
for i in range(1,2925):
    print("i"+str(i))
    ll = [1,2]
    for j in range(2):
        print("j"+str(j))
        url = 'http://m.dianxs.com/book/50856/'+str(i)+'_'+str(ll[j])+'.html'
        response = urllib.request.urlopen(url)
        html = response.read()
        html2 = etree.HTML(html)
        context = html2.xpath('//*[@id="article_content_setting"]/div/div//text()')
        title = html2.xpath('//*[@id="article_content_setting"]/div/h1/text()')
        context2 = str(title)+str(ll[j])
        for t in range(len(context)):
            context2 = context2 + str(context[t])+"\n"
        print(i)
        time.sleep(1)
        with open("novel/shenlang"+str(i)+'_'+str(ll[j])+".txt","a+") as f:
            f.write(context2)

两个代码为近期实践的结果,亲测有效,如有问题,欢迎沟通。

在编写过程中遇到一个很好玩的小知识点:

创建文件夹时,如果是二级文件夹,且需要将路径定位到第二级文件夹,数据存储完成后再返回到第一级文件夹,然后重新构建二级文件夹时,直接使用chdir()是会报错的,需要先跳转到上一级,然后再chdir()才能够实现。

#!/usr/bin/env python
# _*_ UTF-8 _*_

import os

folders = 'OOXX/TTT'
os.makedirs(folders)
os.chdir(folders)
sss = os.path.abspath(os.path.join(os.path.dirname(folders), os.path.pardir))
ttt = os.path.abspath(os.path.join(os.path.dirname(sss), os.path.pardir))
os.chdir(ttt)
folder1 = 'OOXX/EEE'
os.makedirs(folder1)
os.chdir(folder1)

揣测应该是chdir只支持向下遍历改变路径,不支持向上遍历改变路径,所以需要用abspath()与pardir()两个方法

参考文献:

https://blog.csdn.net/hz_zdeveloper/article/details/70172898

发布了137 篇原创文章 · 获赞 93 · 访问量 16万+

猜你喜欢

转载自blog.csdn.net/livan1234/article/details/87269456