参考资料:
- 论一只爬虫的自我修养 http://blog.fishc.com/category/python/spider
- Requests: 让 HTTP 服务人类 http://docs.python-requests.org/zh_CN/latest/
Requests库使用方法与urrlib用法较为类似,但更为简单,下面使用requests来进行图片的抓取.
1. 先写出主函数的代码
import requests
import os
import re
def download_mm(folder='mmImages', pages=10):
"""
下载十个页面的图片,并将其保存进folder目录
"""
#创建保存图片的文件夹
os.mkdir('folder')
os.chdir('folder')
#下载图片页面初始地址
url = 'http://jandan.net/ooxx/'
#图片页面地址全名为http://jandan.net/ooxx/page-2364#comments,可看出图片地址为'url'+'页面数'+ '#comments',先定义一个函数get_page(url)来获取page_num
page_num = int(get_page(url))
#有了图片所在页面的全名地址就可以爬取图片的源地址了,这里我们仅下载十个页面的图片
for i in range(pages):
page_num -= i
#获得十个网页的图片地址,进入页面时我们处于最新页面,因此最终得到的是此页以及前九页的地址
page_url = url+'page-'+str(page_num)+'#comments'
#获得多个图片网址后还需获得每一个图片的源地址才能下载到每一张图片,此处定义一个函数find_images来获取每张图片源地址
img_addrs = find_images(page_url)
#从每张图片源地址下载图片到folder文件夹
save_imgs(folder, img_addrs)
2. 编写在主函数中需要用到的功能函数的代码
(1)先在url = 'http://jandan.net/ooxx/' 页面爬出最新页面数(即page_num)
def get_page(url):
"""
返回单前网页page数,也即url = 'http://jandan.net/ooxx/'的page数
"""
#爬取html页面内容
html= url_open(url).text
#找出含有本页网址的那一段字符串
page=re.search(r'>\[[0-9]{4}\]<',html).group()
#从这一段字符串提取出页面数
page_number=re.search(r'[0-9]{4}',page).group()
return page_number
(2)主函数中利用for循环拼接出十个页面的url,然后利用find_images函数找出每一个页面的的每一张图片的源地址
def find_images(url):
"""
找到图片的源地址
"""
#爬取当前html页面内容
html=url_open(url).text
#找出包含图片源地址的这一段字符串
img_src0=re.findall(r'<img\ssrc=.{,80}.[jpg|png|gif]',html)
#从包含图片源地址的这一段字符串中提取图片的源地址
img_src1=[img_src[10:] for img_src in img_src0]
return img_src1
(3)找出图片源地址后利用再去下载图片
def save_imgs(folder, img_addrs):
"""
保存图片
"""
for img_addr in img_addrs:
#将图片地址的倒数第二个字符串作为图片名
filename=img_addr.split('/')[-1]
#以二进制的方式(content而非text)保存图片源地址内容
img=url_open('http:{}'.format(img_addr)).content
with open(filename,'wb') as f:
f.write(img)
(4)由于打开网页这一步被反复用到,因此可编写一个函数直接调用即可
def url_open(url):
"""
爬取网页
"""
headers = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36'}
req = requests.get(url,headers=headers)
return req
3.总结
(1)在这个爬虫程序中我们想要爬取多个页面内容,因此需要找出这些页面地址的关联,否则只能一个个输入地址来爬取,因此一开始我们需要先爬取第一个页面对其html内容进行分析,找出page_num.
(2)找出规律后利用一个简单的循环便可以爬取多个页面.
(3)对于每一个含有多个图片的页面,需要分析爬取每一张图片的地址才能进行下载
(4)爬取到图片源地址后便可以进行下载(爬取网页并以二进制方式保存)
(5)编写代码的过程中应尽量使得每一个函数仅执行一个功能,如此既方便调用出错时也方便调试查找bug.
4. 利用requests实现Python爬虫入门 (一)中以urllib编写的 交互式有道翻译请求:
import requests
import json
url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule&smartresult=ugc&sessionFrom=https://www.google.com.hk/'
data = dict()
data = dict()
data['type'] = 'AUTO'
data['i'] = input("Plz input what you want to translate: ")
data['doctype'] = 'json'
data['xmlVersion'] = '1.8'
data['keyfrom'] = 'fanyi.web'
data['ue'] = 'UTF-8'
data['action'] = 'FY_BY_CLICKBUTTON'
data['typoResult'] = 'true'
r = requests.post(url, data=data)
trans_response = r.json()['translateResult'][0][0]['tgt']
print('翻译结果: ', trans_response)
网友评论