爬虫制作前置条件:
安装beautifulsoups, lxml, pip
或使用集成开发工具:Anaconda3,以下引用为安装教程
http://blog.youkuaiyun.com/u012318074/article/details/77075209
Beautiful Soup库(bs4)介绍
HTML文件是由一组尖括号构成的标签组织起来的,每一对尖括号形式一个标签,标签之间存在上下关系,形成标签树;Beautiful Soup库则是解析、遍历、维护“标签树”的功能库。
头文件from bs4 import BeautifulSoup
soup = BeautifulSoup(‘data’, ‘lxml’) 前一个参数为要解析的内容,后一个参数则是解释器
urllib.request模块
urllib.request 模块提供了最基本的构造 HTTP 请求的方法,利用它可以模拟浏览器的一个请求发起过程
urlopen() 可以获取远端 html 页面信息,然后通过python 正则对所需要的数据进行分析,匹配出想要用的数据
urlretrieve() 方法直接将远程数据下载到本地,保存图片到上述指定路径并设定文件名
OS模块
OS模块是Python标准库中的一个用于访问操作系统功能的模块,OS模块提供了一种可移植的方法使用操作系统的功能。使用OS模块中提供的接口,可以实现跨平台访问。但是在OS模块中的接口并不是所有平台都通用,有些接口的实现是依靠特定平台下的接口的。在OS模块中提供了一系列访问操作系统功能的接口,便于编写跨平台的应用。
os.getcwd()获取当前文件夹名(字符串);
os.path.join用于路径拼接:
举例:os.path.join(“home”, “me”, “mywork”)
在Linux系统上会返回
“home/me/mywork”
在Windows系统上会返回
“home\me\mywork”
os.chdir(filename)更改路径到xx文件夹
通过查看页面源码可知,所有所需图片均在标签中,使用soup.find_all查找
for picture in soup.find_all('a', class_='a'):
并从中找到图片信息,获取链接到指定参数
img_src = picture.find('img').get('src')
以下附完整代码:
from bs4 import BeautifulSoup
import urllib.request
import os
def downloading(url,m,n):#m为起始页数,n为结束页数
os.chdir(os.path.join(os.getcwd(), 'photos'))#os.path.join用于拼接,os.chdir(filename)更改路径到xx文件夹;os.getcwd()获取当前文件夹名(字符串)
t = 1 # 记录图片张数
for x in range(n-m+1):
html_doc = urllib.request.urlopen(url + "[https]+://[^\s]+" + str(n+x-1)).read().decode('utf-8')#urlopen() 可以获取远端 html 页面信息,然后通过python 正则对所需要的数据进行分析,匹配出想要用的数据
soup = BeautifulSoup(html_doc, "lxml")#前一个参数为要解析的内容,后一个参数则是解释器
for picture in soup.find_all('a', class_='a'):
pic_name = str(t) + '.jpg'#命名
img_src = picture.find('img').get('src')
urllib.request.urlretrieve(img_src, pic_name)#urlretrieve() 方法直接将远程数据下载到本地,保存图片到上述路径并设定文件名
print("Success!" + img_src)
t += 1
print("Next page!")
downloading("https://www.duitang.com/search/?kw=%E6%98%9F%E7%A9%BA&type=feed",1,3)
正则表达式详细介绍:
正则表达式区分大小写
.字符在正则表达式代表着可以代表任何一个字符(包括它本身)
如需匹配.则需要写为.(添加转义符)
import re
key = r"aasdsad123456@qq,comfgdjfgjgfh"
p1 = r"123456@qq\.com"
pattern1 = re.compile(p1)
print pattern1.findall(key)
RE+的作用是将前面一个字符或一个子表达式重复一遍或者多遍
RE*的作用是将前面一个字符或一个子表达式重复零次或者多遍
/s匹配非空字符
^RE匹配除了RE所有字符
http://www.jb51.net/article/50511.htm
http://www.cnblogs.com/chuxiuhong/p/5885073.html#3746346
简易正则表达式便捷生成网站
http://tool.oschina.net/regex/
编码转换:
Python内部的字符串一般都是 Unicode编码。代码中字符串的默认编码与代码文件本身的编码是一致的。所以要做一些编码转换通常是要以Unicode作为中间编码进行转换的,即先将其他编码的字符串解码(decode)成 Unicode,再从 Unicode编码(encode)成另一种编码。
decode 的作用是将其他编码的字符串转换成 Unicode 编码,eg name.decode(“GB2312”),表示将GB2312编码的字符串name转换成Unicode编码
encode 的作用是将Unicode编码转换成其他编码的字符串,eg name.encode(”GB2312“),表示将GB2312编码的字符串name转换成GB2312编码
所以在进行编码转换的时候必须先知道 name 是那种编码,然后 decode 成 Unicode 编码,最后载 encode 成需要编码的编码。当然了,如果 name 已经就是 Unicode 编码了,那么就不需要进行 decode 进行解码转换了,直接用 encode 就可以编码成你所需要的编码。值得注意的是:对 Unicode 进行编码和对 str 进行编码都是错误的。
具体的说就是:如果在UTF-8文件中,则这个字符串就是 UTF-8编码的。它的编码取决于当前的文本编码。当然了,GB2312文本的编码就是GB2312。要在同一个文本中进行两种编码的输出等操作就必须进行编码的转换,先用decode将文本原来的编码转换成Unicode,再用encode将编码转换成需要转换成的编码。
存在问题:所爬图片如何获取原图