nhentai.net的图片爬取

发表于2017/7/1

nhentai是绅士们都懂的网站,平时在上面看漫画时动则一百几十张,一张张打开等加载太麻烦,故基于Python的urllib库和BeautifulSoup库写了个小脚本来爬取图片,在此记录一下。
先上代码:
    import urllib.request as ur
    from bs4 import BeautifulSoup as bs
    origin="https://nhentai.net/g/200103/"  #目标漫画所在的url
    headers = {
        'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36'
      }
    for i in range(1,10000):
        url=origin+str(i)
        try:
            req=ur.Request(url=url,headers=headers)
            result=ur.urlopen(req).read().decode('utf-8')
        except:
            break
        else:
            html=bs(result)
            img=html.select('section#image-container img')[0]
            imgurl=img.get('src')
            ur.urlretrieve(imgurl, filename=str(i)+'.jpg', reporthook=None, data=None)
            
说一下这两个库的主要函数,先是urllib,在Python3中,它的导入方法和Python2不一样,导入语句为import urllib.request as ur。它的作用主要是获取一个html页面中的全部内容,实现这个功能只需要两句话:

req=ur.Request(url=url,headers=headers)

result=ur.urlopen(req).read().decode('utf-8')

第一句话是将对网页的请求封装起来,封装的内容有两个,首先url是目标网站的网址,headers在这里主要提供电脑浏览器的信息。第二句话就是执行封装好的请求,并将目标网站的整个html爬下来。
注:其实很多情况下直接用第二句话就成,将req换成目标网站的url就可以了。但是在这里会报错,错误如下:

HTTP Error 403: Forbidden

原因就是nhentai.net禁止网页爬虫,直接爬取的话由于没有浏览器的信息,所以会被判定为爬虫。解决办法就是加个headers伪装一下。headers的信息获取很简单,随便用浏览器打开一个网站,右键审查元素,选择network,刷新网站,就会显示浏览器发送的http请求,copy一下就好。
当然光是把整个html页面弄下来是不够的,这里还需要用BeautifulSoup来处理,引入代码是from bs4 import BeautifulSoup as bs。几个重要的语句:
  1. html=bs(result) 将爬取的结果用BeautifulSoup来解析。
  2. html.select('CSS选择器') 选择特定的元素,语法和CSS选择器一样,注意这里返回的是列表。
  3. 用get方法获取属性值,如img.get('src')
  4. get_text()方法获取文本内容
代码中用到如下结构:

try:

except:

else:

目的是如果图片爬完了就跳出循环。try是要执行的代码,except是如果出错的处理,else是如果不出错的处理。
最后是如何保存特定内容,这里是图片。所用的语句是 ur.urlretrieve(imgurl, filename=str(i)+'.jpg', reporthook=None, data=None)。该函数说明如下: urlretrieve(url, filename=None, reporthook=None, data=None) url是文件的网址,filename是保存文件的地址,reportbook是进度条,data是要post的数据,这里只关心前两个。

邮箱:zhanjunlang@sina.com