python3学习-初识爬虫
学习了python100天内的知识,还是收获不小的,今天还是记录一下学习python的一些小知识
首先需要了解什么是网络爬虫
网络爬虫是一种互联网机器人,它通过爬取互联网上网站的内容来工作。它是用计算机语言编写的程序或脚本,用于自动从Internet上获取任何信息或数据。机器人扫描并抓取每个所需页面上的某些信息,直到处理完所有能正常打开的页面
简而言之就是利用计算机编写的程序从网站上提取我们需要的信息
一个好的程序首先需要有清晰的逻辑思维
这次的目标是爬取一个网站的图片并保存在本地
首先需要一个目标网站,
以http://sc.chinaz.com/tupian/这个网站为例
接下来需要分析图片的地址,打开firefox的审查元素功能,点击图片可以看到图片的url链接地址,访问也是没有问题的
这里需要注意一下,写正则的时候会考虑到这个问题
接下来需要python中的经典的几个库
urllib
os
re
思路是这样的。首先需要请求目标url,获取html资源,然后从html中利用正则抓取到需要的图片链接,最后保存在本地文件夹
第一步,请求url资源
代码如下
```python
from urllib import request
import urllib
def gethtml(url):
page=urllib.request.urlopen(url)
html=page.read().decode('utf-8')
print(html)
html=gethtml('http://sc.chinaz.com/tupian/')
执行结果如下
接下来需要从html中提取图片链接,从代码中看到的response中需要的图片在
<a target="_blank" href="http://sc.chinaz.com/tupian/200818193700.htm" alt="夏天小性感日本美女图片"><img src2="http://pic1.sc.chinaz.com/Files/pic/pic9/202008/apic27135_s.jpg" alt="夏天小性感日本美女图片"></a>
这一段中,需要正则匹配.jpg的文件地址
代码如下
from urllib import request
import re
import urllib
def gethtml(url):
page=urllib.request.urlopen(url)
html=page.read().decode('utf-8')
return html
def getimg(html):
reg = '<img src2="(.*\.jpg)"'
imgre = re.compile(reg)
imglist=imgre.findall(html)
return imglist
html=gethtml('http://sc.chinaz.com/tupian/')
print(getimg(html))
执行结果如下
将链接中的图片遍历,保存到本地
代码如下
from urllib import request
import re
import os
import urllib
from urllib import parse
def gethtml(url):
page=urllib.request.urlopen(url)
html=page.read().decode('utf-8')
return html
def getimg(html):
reg = '<img src2="(.*\.jpg)"'
imgre = re.compile(reg)
imglist=imgre.findall(html)
x=0
path='D:\\test'
if not os.path.isdir(path):
os.makedirs(path)
paths=path+'\\'
for imgurl in imglist:
urllib.request.urlretrieve(imgurl,'{0}{1}.jpg'.format(paths,x))
x=x+1
return imglist
html=gethtml('http://sc.chinaz.com/tupian/')
print(getimg(html))
执行结果如下
以上就完成了对一个网页图片的抓取。
以上还存在一个问题,直接审查元素的时候,会发现图片的链接是以下链接
<img alt="夏天小性感日本美女图片" src="http://pic1.sc.chinaz.com/Files/pic/pic9/202008/apic27135_s.jpg">
和response中的html中的链接是不一样的,如果把正则表达式修改成审查元素中的链接地址是什么都抓不到的,所以,在编写表达式的时候一定要看清楚response中的链接地址
接下来尝试需要抓取多个页面的图片
再观察一下response的html代码
继续写正则提取其中的.html界面
代码如下
from urllib import request
import re
import urllib
def gethtml(url):
page=urllib.request.urlopen(url)
html=page.read().decode('utf-8')
return html
def geturls(html):
pa='<a href="(/tupian/.*\.html)"'
ma=re.compile(pa)
urlslist=ma.findall(html)
return urlslist
html=gethtml('http://sc.chinaz.com/tupian/')
print(geturls(html))
执行结果如下
提取出来的url链接并不是完整的链接地址,需要进行url的拼接,引入prase模块
代码如下
from urllib import request
import re
import urllib
from urllib import parse
def gethtml(url):
page=urllib.request.urlopen(url)
html=page.read().decode('utf-8')
return html
def geturls(html):
pa='<a href="(/tupian/.*\.html)"'
ma=re.compile(pa)
urlslist=ma.findall(html)
return urlslist
def geturllist(html):
for u in geturls(html):
urls=parse.urljoin("http://sc.chinaz.com",u)
print(urls)
html=gethtml('http://sc.chinaz.com/tupian/')
print(geturllist(html))
代码执行结果如下
最后遍历每一个url地址,从每一个地址中提取到html资源,再从资源中提取出来其中的jpg文件保存到本地,最终代码如下
from urllib import request
import re
import urllib
import os
from urllib import parse
def gethtml(url):
page=urllib.request.urlopen(url)
html=page.read().decode('utf-8')
return html
def geturls(html):
pa='<a href="(/tupian/.*\.html)"'
ma=re.compile(pa)
urlslist=ma.findall(html)
return urlslist
def geturllist(html):
urls = [parse.urljoin("http://sc.chinaz.com",u) for u in geturls(html)]
return urls
def getimgs(html):
reg = '<img src2="(.*\.jpg)"'
imgre = re.compile(reg)
imglist = imgre.findall(html)
x = 0
path = 'D:\\test'
if not os.path.isdir(path):
os.makedirs(path)
paths = path + '\\'
for imgurl in imglist:
urllib.request.urlretrieve(imgurl, '{0}{1}.jpg'.format(paths, x))
x = x + 1
return imglist
def gethtmls():
x=0
for m in urls:
htmls=urllib.request.urlopen(m).read().decode('utf-8')
reg = '<img src2="(.*\.jpg)"'
imgre = re.compile(reg)
imglist = imgre.findall(htmls)
path = 'D:\\test'
if not os.path.isdir(path):
os.makedirs(path)
paths = path + '\\'
for imgurl in imglist:
urllib.request.urlretrieve(imgurl,'{0}{1}.jpg'.format(paths, x))
x = x + 1
html=gethtml('http://sc.chinaz.com/tupian/')
urls=geturllist(html)
print(gethtmls())
抓取效果
如果要提高抓取效率还可以加入线程,这个自己水平有限,就不记录了