]> git.lizzy.rs Git - nhentai.git/blob - nhentai/parser.py
python3 support
[nhentai.git] / nhentai / parser.py
1 from __future__ import print_function
2 import sys
3 import re
4 import requests
5 from bs4 import BeautifulSoup
6 from constant import DETAIL_URL, SEARCH_URL
7 from logger import logger
8
9
10 def dojinshi_parser(id):
11     if not isinstance(id, (int, )) and (isinstance(id, (str, )) and not id.isdigit()):
12         raise Exception('Dojinshi id(%s) is not valid' % str(id))
13     id = int(id)
14     logger.debug('Fetching dojinshi information of id %d' % id)
15     dojinshi = dict()
16     dojinshi['id'] = id
17     url = '%s/%d/' % (DETAIL_URL, id)
18
19     try:
20         response = requests.get(url).content
21     except Exception as e:
22         logger.critical('%s%s' % tuple(e.message))
23         sys.exit()
24
25     html = BeautifulSoup(response)
26     dojinshi_info = html.find('div', attrs={'id': 'info'})
27
28     title = dojinshi_info.find('h1').text
29     subtitle = dojinshi_info.find('h2')
30
31     dojinshi['name'] = title
32     dojinshi['subtitle'] = subtitle.text if subtitle else ''
33
34     dojinshi_cover = html.find('div', attrs={'id': 'cover'})
35     img_id = re.search('/galleries/([\d]+)/cover\.(jpg|png)$', dojinshi_cover.a.img['src'])
36     if not img_id:
37         logger.critical('Tried yo get image id failed')
38         sys.exit()
39     dojinshi['img_id'] = img_id.group(1)
40     dojinshi['ext'] = img_id.group(2)
41
42     pages = 0
43     for _ in dojinshi_info.find_all('div', class_=''):
44         pages = re.search('([\d]+) pages', _.text)
45         if pages:
46             pages = pages.group(1)
47             break
48     dojinshi['pages'] = int(pages)
49     return dojinshi
50
51
52 def search_parser(keyword, page):
53     logger.debug('Searching dojinshis of keyword %s' % keyword)
54     result = []
55     response = requests.get(SEARCH_URL, params={'q': keyword, 'page': page}).content
56     html = BeautifulSoup(response)
57     dojinshi_search_result = html.find_all('div', attrs={'class': 'preview-container'})
58     for dojinshi in dojinshi_search_result:
59         dojinshi_container = dojinshi.find('div', attrs={'class': 'caption'})
60         title = dojinshi_container.text.strip()
61         id_ = re.search('/g/(\d+)/', dojinshi.a['href']).group(1)
62         result.append({'id': id_, 'title': title})
63     return result
64
65
66 def print_dojinshi(dojinshi_list):
67     if not dojinshi_list:
68         return
69     logger.log(15, 'Print dojinshi list')
70     print('-' * 60)
71     for dojinshi in dojinshi_list:
72         print(dojinshi['id'], '-', dojinshi['title'])
73     print('-' * 60)
74
75
76 if __name__ == '__main__':
77     print(dojinshi_parser(32271))