社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

JB的Python之旅-爬虫篇--urllib和Beautiful Soup

jb • 7 年前 • 784 次点击  

JB的Python之旅-爬虫篇--urllib和Beautiful Soup

啃面包是辛苦的,那就开始学习爬虫吧,而学习爬虫的初衷很简单,爬图爬图,这就是学习的动力~

1.爬虫信息了解
1)爬虫的定义:
先了解,什么叫爬虫,上度娘搜了一番,解释如下:

网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,
自动地抓取万维网信息的程序或者脚本。

而互联网就犹如一张蜘蛛网,而爬虫可以模拟浏览器的行为,做想做的事情,比如自动下载妹子图、下载小说;

2)为什么选择Python?
而实现爬虫技术的语言有很多种,Java、 C++、Python都可以用来爬虫,但为什么选择Python,是因为Python有强大的第三方库,能简单快速的实现想要的功能,另外Python爬取内容后,也能用于数据挖掘跟分析,简单是一条龙服务,


3)爬虫原理及过程 上面提及到,爬虫是模拟浏览器的行为,而浏览器获取网页信息的过程大致如下:

发送请求->获得网页->解析网页->抽取并存储内容

简单的说,想服务器发起请求后,会得到返回的页面结果,通过解析页面之后,可以抽取想要的那部分信息,然后就可以存储在指定文档或者入库;

而整个过程需要简单了解http协议及网页基本知识,比如POST\GET、html、JS等;

4)本章内容
4.1)urllib介绍,获得网页内容
4.2)介绍Beautiful Soup
4.3)实战

2.URL
在开始前,有必要介绍下URL,因为URL是一切开端;
简单的来讲,URL就是在浏览器端输入的 http://www.baidu.com 这个字符串。

通俗地说,URL是Internet上描述信息资源的字符串,主要用在各种WWW客户程序和服务器程序上。

采用URL可以用一种统一的格式来描述各种信息资源,包括文件、服务器的地址和目录等。

URL的一般格式为(带方括号[]的为可选项):
protocol :// hostname[:port] / path / [;parameters][?query]#fragment

URL的格式由三部分组成:

①第一部分是协议(或称为服务方式)。

②第二部分是存有该资源的主机IP地址(有时也包括端口号)。

③第三部分是主机资源的具体地址,如目录和文件名等。

第一部分和第二部分用“://”符号隔开,

第二部分和第三部分用“/”符号隔开。

第一部分和第二部分是不可缺少的,第三部分有时可以省略。

举例: 例:http://www.rol.cn.net/talk/talk1.htm

其计算机域名为www.rol.cn.net。

超级文本文件(文件类型为.html)是在目录/talk下的talk1.htm。

这是瑞得聊天室的地址,可由此进入瑞得聊天室的第1室。

例:file://ftp.yoyodyne.com/pub/files/foobar.txt

上面这个URL代表存放在主机ftp.yoyodyne.com上的pub/files/目录下的一个文件,文件名是foobar.txt。

爬虫最主要的处理对象就是URL,会根据URL地址取得所需要的文件内容,然后对它进行进一步处理。

3.urllib

Python里有一个内置的urllib库,是学习爬虫的基础核心,而这个库的作用是向服务器发出请求并获得网页内容,也就是学习爬虫的第一步

由于用的是Python3,在Python3中只有唯一的urllib库,而在Python2是有区分urllib2和urllib

在使用之前,一起看看urllib库有什么东东

import urllib
print(dir(urllib))

输出的结果:
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__', 'error', 'parse', 'request', 'response']

可以看到urllib除了以双下划线开头结尾的内置属性外,还有4个重要的属性,分别是error,parse,request,response。

这4个属性中最重要的当属request了,它完成了爬虫大部分的功能,我们先来看看request是怎么用的。

request的使用: request请求最简单的操作是用urlopen方法,代码如下:

import urllib.request
response = urllib.request.urlopen('http://www.baidu.com/')
result = response.read()
print(result)

运行结果如下:

b'<!DOCTYPE html>\n<!--STATUS OK-->\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n...

看到后一脸懵逼,把全部内容copy出来看,也并非乱码,内容跟网页的源码是一致的,但为了美观点,在读取的时候改一下编码,就变成这样了(如果有编码问题,也是同样的处理方案):

import urllib.request
response = urllib.request.urlopen('http://www.baidu.com/')
result = response.read().decode("uft-8")
print(result)

运行结果如下:

!DOCTYPE html>
<!--STATUS OK-->
<html>
<head>
    
    <meta http-equiv="content-type" content="text/html;charset=utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=Edge">
	<meta content="always" name="referrer">

从输出的结果来看,至少有点层次感了,而这个就是我们想要的网页内容啦,4行代码就能把网页内容输出,简单吧~

上面的几句,就能获取到网页信息,但如果想爬取视频/图片呢,如何处理?或者需要网页的一些信息,也怎么处理?

import urllib.request
head = {
    "User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.104 Safari/537.36 Core/1.53.4843.400 QQBrowser/9.7.13021.400"
}

pic_url = "http://e.hiphotos.bdimg.com/album/h%3D370%3Bq%3D90/sign=c4164900fbf2b211fb2e8349fabb1405/d043ad4bd11373f0562c40eca40f4bfbfbed04b5.jpg"
request = urllib.request.Request(pic_url,headers=head)
response = urllib.request.urlopen(request)  
result = response.read()

with open("ganglian.jpg","wb") as f :
    f.write(result)


#但是官方推荐是使用下面这种方式
path = "jb.png"
urllib.request.urlretrieve(pic_url,path)

Request 对于一般的网站,上面几句就能获取网页信息,但对于企业而已,网页里的信息也是很重要的,他们会做一些手段,防止爬取,而这种情况,唯一的办法就是让自己装的更像浏览器。

首先,用浏览器看一个简单的请求,比如用的Chrome浏览器, 按F12->network,然后地址栏输入一个url打开网页,就可以查看request的headers,可以把这个浏览器的headers信息复制下来使用。 requests head信息,而head信息有哪些(图二)?

一次访问,是包含了很多信息,通常伪装的是User-Agent这块,那怎么做?

这时候就需要用到urllib.request下的Request方法了,这个方法常用的就是传两个参数,url跟header,而这个header就是我们要伪装的信息了,从上看可以到一些信息,那手法就是这样的:

import urllib.request

head = {
    "Host":"www.baidu.com",
    "User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.104 Safari/537.36 Core/1.53.4843.400 QQBrowser/9.7.13021.400",
    "Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"
}
request = urllib.request.Request("http://www.baidu.com",headers=head)
response = urllib.request.urlopen(request)
result = respone.read
print(response.read().decode('utf-8'))

而输出的结果跟上面的例子是一样的,不同的是,这里把header信息修改下,这样做的就好像真的是浏览器发送的一样;

cookie 什么叫cookie?指某些网站为了辨别用户身份、进行 session 跟踪而储存在用户本地终端上的数据,这也意味着,如果想登录这些网站,那我们先手动登录一次,登录成功后,服务端会分配cookie,那我们把cookie也发送过去,就可以模拟成真正的用户了。 那,我们要怎么做才能把我们的cookie发送过去呢?




    
import urllib.request
import http.cookiejar
cookie=http.cookiejar.CookieJar() #声明一个CookieJar对象实例来保存cookie
handler=urllib.request.HTTPCookieProcessor(cookie)
# 利用urllib.request库的HTTPCookieProcessor对象来创建cookie
opener=urllib.request.build_opener(handler)
# 通过handler来构建opener
response=opener.open("http://www.jianshu.com/")
# 此处的open方法同urllib.request的urlopen方法,也可以传入request
for item in cookie:
    print('name=',item.name)
    print('value=',item.value)

这里遇到了个坑,pytohn3中是加载http.cookiejar,http.cookies模块,不是python2中的import cookielib。 注意CookieJar()是属于http.cookiejar模块,而不是http.cookies模块,否则会报错: 'module' object has no attribute 'CookieJar'

beautifulSoup
通过上面的方式,基本上能获取到大部分网站的html代码信息,那网页信息获取已经完成了,接下来就是数据解析了,解析用的较多的是Beautiful Soup、正则、xpath,正则很实用,但是需要记住匹配模式,入手成本高,那一起了解下bs是啥玩意把~

beautifulSoup “美味的汤,绿色的浓汤”
一个灵活又方便的网页解析库,处理高效,支持多种解析器。
利用它就不用编写正则表达式也能方便的实现网页信息的抓取

由此可见,bs是一个从html文件中提取数据的Python库,是爬虫利器~

bs库下载: PyCharm直接安装: File -> Default Settings -> Project Interpreter 选择Python 3的版本 -> 点+号 -> 搜索beautifulsoup4 安装即可

其他方式的安装,自行查询~

使用方式

from bs4 import BeautifulSoup  
import urllib.request
head = {
    "User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.104 Safari/537.36 Core/1.53.4843.400 QQBrowser/9.7.13021.400"
}
request = urllib.request.Request("http://www.baidu.com",headers=head)
response = urllib.request.urlopen(request)
result = response.read().decode("utf-8")

soup = BeautifulSoup(result)  #创建 beautifulsoup 对象
print(soup.title)   #输出soup 对象的内容,格式化输出

如果想打开本地的html文件来创建对象,则这样处理:
soup = BeautifulSoup(open('jb.html'))

这里有一点需要注意下,直接这样print的话,虽然能执行,但是会看到一场错误,如下:
 UserWarning: No parser was explicitly specified, so I'm using the best available HTML parser for this system ("html.parser").
 
 解决方案下面也列出了:
BeautifulSoup(YOUR_MARKUP})

to this:

 BeautifulSoup(YOUR_MARKUP, "html.parser")
 
 意思很明显,在创建对象时指定解析器,html.parser是内置的 html解析器,也可以用lxml.parser

四大对象种类
Beautiful Soup 将复杂HTML文档转换成一个复杂的树形结构,每个节点都是 Python 对象,所有对象可以归纳为4种:
Tag
NavigableString
BeautifulSoup
Comment
下面我们进行一一介绍:
1)Tag(标签)
Tag 是什么?通俗点讲就是 HTML 中的一个个标签,需要注意,只会返回所有内容中第一个符合要求的标签,例如:

<title>The Dormouse's story</title>
<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>  
上面的 title a 等等 HTML 标签加上里面包括的内容就是 Tag

    print(soup.title)
    
    print(soup.head)
    
    print(soup.a)
    
    print(soup.p)

对于tag来说,有两个重要的属性,是name和attrs

print soup.name
print soup.head.name

soup 对象本身比较特殊,它的 name 即为 [document],对于其他内部标签,输出的值便为标签本身的名称。

attrs

print soup.p.attrs
\#{'class': ['title'], 'name': 'dromouse'}  

这里把P标签的所有属性都打印出来,得到的类型是一个字典,可以通过键取值(print(soup.p['class'])),也可以使用get方法通过传入属性的名称(print(soup.p.get('class')) 也可以对属性和内容进行修改,如soup.p['class'] = "jbtest",print(soup.p)

NavigableString(标签内部文字) soup.p.string

BeautifulSoup(文档的全部内容) 跟Tag相像,可以分别获取它的类型、名称、属性

Comment(特殊类型的 NavigableString ) 输出的内容不包括注释符号,但在使用前,需要判断下类型:

if type(soup.a.string)==bs4.element.Comment:
    print soup.a.string  

实战说明:
想爬取网上内容,简单了解下,大部分网页都是下面情况之一:
1)一个网页包括所有信息,不需要点击下一页(如果需要点击下一页的,其实原理也一样,只是在URL后面加个page即可)
2)没有分页功能,需要滑动到底部,才会继续加载

实战1:下载小说
因为全职高手出了TV版,觉得还不错,就沉迷小说了,前段时间听说有更新了,之前就是用浏览器打开网页小说,然后在线一页一页翻,刚好现在学了爬虫,试试看(坏笑)

网页链接:http://www.biqukan.com/2_2675/

打开网页看了下,下面红框里的内容就是需要的内容,点击发现里面还是一个网页,然后就是小说正文内容,那大致想了下,流程应该是这样的:

1)获取下图需要的网页信息,并且把每章小说的URL获取出来
2)打开小说的URL,把正文获取出来
3)获取小说的标题,把回去的正文写到本地

1)获取下图需要的网页信息,并且把每章小说的URL获取出来
打开网页,按F12打开开发者工具,选择Elements选项(默认就是这选项),然后点击Elements选项左边两个的图标按钮(如下图1),点击后,图标按钮会变蓝色,然后把鼠标移动到网页上,然后在需要的地方进行点击(如图2),点击后右边的Elements就会自动定位到这里区域上(如图3)

然后在Elements往上翻,发现这些信息都是在一个class叫listman里面,全局搜索了下,发现这个listman是唯一的,因此可以直接使用find_all直接查找这个叫listman,然后拿到一个对象,里面的内容就是listman下的

接下来是先把非a标签无关的过滤点,过滤后是这样的:

观察这个结果,发现前12章不是我想要的,看了下网页结构,前12章就是最新章节列表,但不是我们需要的,所以也要过滤下前12章过滤章节

到这里,每章的小说URL获取出来的;

2)打开小说的URL,把正文获取出来 小说URL:http://www.biqukan.com/2_2675/1008632.html,打开后继续按照刚刚的套路,F12,点击小说正文区域,得到的信息就是这堆正文是在一个叫showtxt的class里面且showtxt是全局唯一,也按照刚刚的套路获取,里面的东西就是我们想要的正文啦~(开心脸)

小说链接、小说名称、正文都有了,就可以进行读写了,至此,小说就保存下来啦~

但因为楼主用的是win10的系统,在实际操作上,遇到一个Windows特有的问题--编码问题,那就是在写文件的时候,会报错: UnicodeEncodeError: 'gbk' codec can't encode character '\xa0' in position 4033: illegal multibyte sequence

那解决方案就是在写的时候指定编码格式,比如encoding = 'utf-8'来解决问题

另外要注意,如果文件下载是指定目录,建议判断对应文件夹是否存在,不存在则先创建,否则也会报错

脚本代码如下:

 # -*- coding: utf-8 -*-
import urllib.request
from bs4 import BeautifulSoup
from urllib import error
import os

novel_url = "http://www.biqukan.com/2_2675/"   #小说地址
novel_base_url = "http://www.biqukan.com/"     #小说首页地址,拼接使用
save_dir = "Novel/"                            #下载小说的存放目录

#获取所有章节的url信息
def get_download_url():
    download_req = urllib.request.Request(novel_url)
    download_res = urllib.request.urlopen(download_req,timeout=20)
    download_content = download_res.read()
    download_soup = BeautifulSoup(download_content,"html.parser")

    listmain = download_soup.find_all(attrs={'class':'listmain'})
    a_list = []

    for i in listmain:
        if 'a' not in str(i):
            continue
        for d in i.findAll('a'):
            a_list.append(d)
    result_list = a_list[12:]
    return result_list

#获取正文内容并且开始下载
def get_download_content(c):
    download_url = novel_base_url + c.attrs.get('href')
    download_name = c.string
    download_req = urllib.request.Request(download_url)
    download_response = urllib.request.urlopen(download_req,timeout=20)
    download_content = download_response.read()
    download_soup = BeautifulSoup(download_content,'html.parser')

    showtxt = download_soup.find_all(attrs={'class':'showtxt'})
    for txt in showtxt:
        save_novel(txt,save_dir+download_name+".txt")



#get_text()方法:用来获取标签里面的文本内容,在括号里面加"strip=True"可以去除文本前后多余的空格
#保存小说到本地
def save_novel(txt,path):
    try:
        if not os.path.exists(save_dir):
            os.makedirs(save_dir)
        with open(path,"w",encoding="utf-8") as f:
            f.write(txt.get_text(strip=True))
    except (error.HTTPError,OSError) as e:
        print(str(e))
    else:
        print('download success :'+path)


if __name__ == '__main__':
    novel_list = get_download_url()
    for content in novel_list:
        get_download_content(content)

实战2
爬取百度图片里的图片,网站特点:下滑会自动加载更多内容,没有上下一页的按钮

工作上经常需要用到图片,然后每次都要网上搜,而且还要去各种网站,比较麻烦,所以想着效果是:提供脚本输入关键字,然后在百度图片处进行相关下载到本地

思路就是:
1)用户执行脚本后,手动输入想输入的内容
2)拼接URL,进行爬取
3)获取HTML,拿到结果写入数据

说干就干,先打开百度图片首页:http://image.baidu.com/

随便搜索一个内容:钢之炼金术师
https://image.baidu.com/search/index?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fm=index&fr=&hs=0&xthttps=111111&sf=1&fmq=&pv=&ic=0&nc=1&z=&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&ie=utf-8&word=%E9%92%A2%E4%B9%8B%E7%82%BC%E9%87%91%E6%9C%AF%E5%B8%88&oq=%E9%92%A2%E4%B9%8B%E7%82%BC%E9%87%91%E6%9C%AF%E5%B8%88&rsp=-1

看了下链接,搜索的内容去哪里了?一脸懵逼后尝试查一下英文字符

在搜索个英文:test
https://image.baidu.com/search/index?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fm=index&fr=&hs=0&xthttps=111111&sf=1&fmq=&pv=&ic=0&nc=1&z=&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&ie=utf-8&word=test

这次能看出,word后面带的就是输入的内容了,因此想搜索什么,就把word后面的value修改对应的词就好啦~

但是,那上面的word 后面的这串是什么鬼?“%E9%92%A2%E4%B9%8B%E7%82%BC%E9%87%91%E6%9C%AF%E5%B8%88”

做个实验:

kw = urllib.request.quote("钢之炼金术师")
print(kw)

输出的结果:
%E9%92%A2%E4%B9%8B%E7%82%BC%E9%87%91%E6%9C%AF%E5%B8%88

嗯,发现这个结果跟上面的是一模一样的,而这个quote函数就是用于屏蔽特殊字符的,比如空格、中文等,因为URL只允许部分ASCLL(数字字母和部分符号),其他的字符(包括汉字)是不符合URL的标准,所以URL需要对这些字符进行URL编码,URL编码的方式是把需要编码的字符转化为 %xx 的形式。通常 URL 编码是基于 UTF-8 的,函数说明也提及到给予UTF-8进行encode~

回到重点,那拼接网页就是:....(前面一大坨)+word="想搜索的内容"

https://blog.csdn.net/xiligey1/article/details/73321152 http://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word=%E9%92%A2%E7%82%BC%E5%A3%81%E7%BA%B8&pn=0&gsm=64&ct=&ic=0&lm=-1&width=0&height=0

看了下网页的结构,信息都在一个叫imgpage的class里面,而它的children里面,class是imgitem就是我们所需要的~ 看了下,imgpage并不是唯一,但里面的内容都是我们需要的,因此我们需要提取所有class叫imgpage的内容

于是就写下了imgpage_list = get_url_soup.findAll(attrs={"class":"imgpage"}),结果执行后发现,尼玛,空的???

空就代表没有这个class,就想着把这个soup打印出来看,结果,惊呆了~

这尼玛,为什么打出来的是JS???例子1直接打印suop可是html的内容:

以为是代码哪里错了,反复检查,貌似都没问题啊,无助之下,只能求助,结果科普了下,例子1爬取的网站是静态的,在页面中右键查看源码就能看到图片中的位置,就能把页面源码保存后解析获取内容

但百度图片这个网站,选择图片是能显示图片的位置和样式,但是右键查看源码,发现都是JS,是没有任何链接信息,原因是因为,百度图片的网页是一个动态页面,它的网页原始数据其实是没有这个个图片,是通过运行JS,把这个图片的数据插入到网页的html标签里面,这样造成的结果是,按F12虽然能看到这个标签,但实际去获取的时候,是没有这个标签的,它只在运行时加载和渲染,那这种情况怎样才能把图片下载下来?答案是抓包

首先说明下,通过JS去做,好处时可以异步去加载或者处理,而百度图片就是一个例子,因此要看的是异步的数据,还是原来的网页,F12,选择network,选择XRH~

XRH是什么?XHR 全称:XMLHttpRequest,提供了对 HTTP 协议的完全的访问,而ajax通过原生的XMLHttpRequest对象发出HTTP请求,得到服务器返回的数据后,再进行处理。

而ajax = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML)

因此明白了,Chrome的XRH是用来记录ajax的请求,而百度图片用的就是ajax,因此就是这XRH看数据了~

回到上文,选择XRH后,是没有数据的,刷新下网页,发现出现了一条请求,但是分析后发现没有什么作用,然后就模拟下用户行为,不停的下滑刷新图片,结果就发现不同下滑的时候,会重复出现一条类似一样的请求,点击请求后再点击Preview,看到是一个jsonshuj ,点开data,能看到这里面有30条数据,随意点击一条展开后发现,需要的数据就在这里面了,内容有多条url信息,手动打开后发现这几个URL都是可以下载所需的图片~

整理下信息,回头看,百度图片一开始只加载30张图片,当下滑时,页面会动态加载一条json数据,每次json数据里面包含30条信息,信息里面包含图片的URL,JS会把这些URL解析并显示,从而达到每次滚动底部又多出30张图片~

URL获取了,那怎么滑动操作呢?接下来就分析下,一直出现的json数据有没有规律?

点击Headers,对比请求信息,发现大多数字段都是保持不变,唯有pn字段是每次以30的步长递增,这跟上面说的30张图片不就对应的上吗?(坏笑)

当然,还有queryWord跟word的值都是想要搜索的内容,因此把请求的URL copy出来,到浏览器上访问:

在里面直接搜索图片的下载关键字,比如thumbURL,发现在能这个网页上查询到,并且图片正常,记下来就是直接用文本提取就好了
https://image.baidu.com/search/acjson?tn=resultjson_com&ipn=rj&ct=201326592&is=&fp=result&queryWord=%E9%92%A2%E4%B9%8B%E7%82%BC%E9%87%91%E6%9C%AF%E5%B8%88&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=-1&z=&ic=0&word=%E9%92%A2%E4%B9%8B%E7%82%BC%E9%87%91%E6%9C%AF%E5%B8%88&s=&se=&tab=&width=&height=&face=0&istype=2&qc=&nc=1&fr=&pn=60&rn=30&gsm=3c&1524867815458=

基本上,流程已经分析完了,贴上源码

https://blog.csdn.net/qq_32166627/article/details/60882964~

import urllib.request
from bs4 import BeautifulSoup
import urllib.parse
import re
import os
path = "pic/"
import json
pic_url = "https://image.baidu.com/search/acjson?tn=resultjson_com&ipn=rj&ct=201326592&is=&fp=result&queryWord=%E9%92%A2%E4%B9%8B%E7%82%BC%E9%87%91%E6%9C%AF%E5%B8%88" \
          "&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=-1&z=&ic=0&word=%E9%92%A2%E4%B9%8B%E7%82%BC%E9%87%91%E6%9C%AF%E5%B8%88&s=&se=&tab=&width=&height=&face=0&istype=2&qc=&nc=1&fr=&pn=90&rn=60&gsm=3c&1524867815458="

heads= {
     'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',
     "referer":"https://image.baidu.com"
}

def get_download_url():
    get_url_request = urllib.request.Request(pic_url,headers=heads)
    get_url_response = urllib.request.urlopen(get_url_request,timeout=20)
    get_url_context = get_url_response.read().decode("utf-8")


    pic_url1 = re.findall("thumbURL:https", get_url_context, re.S)

    count = 0

    for i in range(len(pic_url)):
        begin = get_url_context.find("thumbURL",count)

        end = get_url_context.find("jpg",begin)

        download_url = get_url_context[begin+11:end+3]

        #字符串判空
        if download_url:
            if not os.path.exists(path):
                os.mkdir(path)
            urllib.request.urlretrieve(download_url,path+str(i+1)+".png")

        count = end


if __name__ == "__main__":
    get_download_url()

本章节就结束到这里了~

本来之前规划很多东西,但是因为最近比较忙,进度非常慢,而且有点事情耽搁,python这块后面会随缘更新,了解到什么知识就写什么文章上去,主要涉及到测试、前端、python、git等等~

感谢支持~


今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/fLUKcLAG8e
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/12018
 
784 次点击