Python 爬虫入门 (二) 使用Requests来爬取图片

参考资料:

  1. 论一只爬虫的自我修养 http://blog.fishc.com/category/python/spider
  2. 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)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,294评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,780评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,001评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,593评论 1 289
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,687评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,679评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,667评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,426评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,872评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,180评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,346评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,019评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,658评论 3 323
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,268评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,495评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,275评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,207评论 2 352

推荐阅读更多精彩内容