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

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

1.爬虫信息了解

1)爬虫的定义:

先了解,什么叫爬虫,上度娘搜了一番,解释以下:前端

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

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

python

2)为何选择Python?

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


3)爬虫原理及过程

上面说起到,爬虫是模拟浏览器的行为,而浏览器获取网页信息的过程大体以下:web

发送请求->得到网页->解析网页->抽取并存储内容
复制代码

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

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

正则表达式

4)本章内容

4.1)urllib介绍,得到网页内容<br>
4.2)介绍Beautiful Soup<br>
4.3)实战<br>
复制代码

2.URL

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

通俗地说,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)
复制代码

4.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="想搜索的内容"

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=

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

import urllib.request
from bs4 import BeautifulSoup
import urllib.parse
import re
import os
path = "pic/"
import json
# pn就是图片量,20一页,对应第一页,40对应第二页
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自带的urllib的用法,而且也介绍bs如何使用,结合两个实战案例,基本上对这块的使用理解会更新~
下篇会介绍requests跟Scrapy,敬请期待~

最后再说点 原本以前规划不少东西,可是由于最近比较忙,进度很是慢,并且有点事情耽搁,python这块后面会随缘更新,了解到什么知识就写什么文章上去,主要涉及到测试、前端、python、git等等~

参考文献:
https://blog.csdn.net/qq_32166627/article/details/60882964
https://blog.csdn.net/xiligey1/article/details/73321152

感谢支持~

相关文章
相关标签/搜索