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