script.py
:
#!/usr/bin/python3
from urllib.parse import urljoin
import json
import bs4
import click
import aiohttp
import asyncio
import async_timeout
BASE_URL = 'http://e-bane.net'
async def fetch(session, url):
try:
with async_timeout.timeout(20):
async with session.get(url) as response:
return await response.text()
except asyncio.TimeoutError as e:
print('[{}]{}'.format('timeout error', url))
with async_timeout.timeout(20):
async with session.get(url) as response:
return await response.text()
async def get_result(user):
target_url = 'http://e-bane.net/modules.php?name=Stories_Archive'
res = []
async with aiohttp.ClientSession() as session:
html = await fetch(session, target_url)
html_soup = bs4.BeautifulSoup(html, 'html.parser')
date_module_links = parse_date_module_links(html_soup)
for dm_link in date_module_links:
html = await fetch(session, dm_link)
html_soup = bs4.BeautifulSoup(html, 'html.parser')
thread_links = parse_thread_links(html_soup)
print('[{}]{}'.format(len(thread_links), dm_link))
for t_link in thread_links:
thread_html = await fetch(session, t_link)
t_html_soup = bs4.BeautifulSoup(thread_html, 'html.parser')
if is_article_match(t_html_soup, user):
print('[v]{}'.format(t_link))
# to get main article, uncomment below code
# res.append(get_main_article(t_html_soup))
# code below is used to get thread link
res.append(t_link)
else:
print('[x]{}'.format(t_link))
return res
def parse_date_module_links(page):
a_tags = page.select('ul li a')
hrefs = a_tags = [x.get('href') for x in a_tags]
return [urljoin(BASE_URL, x) for x in hrefs]
def parse_thread_links(page):
a_tags = page.select('table table tr td > a')
hrefs = a_tags = [x.get('href') for x in a_tags]
# filter href with 'file=article'
valid_hrefs = [x for x in hrefs if 'file=article' in x]
return [urljoin(BASE_URL, x) for x in valid_hrefs]
def is_article_match(page, user):
main_article = get_main_article(page)
return main_article.text.startswith(user)
def get_main_article(page):
td_tags = page.select('table table td.row1')
td_tag = td_tags[4]
return td_tag
@click.command()
@click.argument('user')
@click.option('--output-filename', default='out.json', help='Output filename.')
def main(user, output_filename):
loop = asyncio.get_event_loop()
res = loop.run_until_complete(get_result(user))
# if you want to return main article, convert html soup into text
# text_res = [x.text for x in res]
# else just put res on text_res
text_res = res
with open(output_filename, 'w') as f:
json.dump(text_res, f)
if __name__ == '__main__':
main()
requirement.txt
:
aiohttp>=2.3.7
beautifulsoup4>=4.6.0
click>=6.7
यहाँ स्क्रिप्ट का python3 संस्करण है (Ubuntu 17.10 पर python3.5 पर परीक्षण किया गया )।
कैसे इस्तेमाल करे:
- इसका उपयोग करने के लिए दोनों कोड को फाइलों में डाला। उदाहरण के लिए कोड फ़ाइल है
script.py
और पैकेज फ़ाइल है requirement.txt
।
- भागो
pip install -r requirement.txt
।
- उदाहरण के रूप में स्क्रिप्ट चलाएँ
python3 script.py pa4080
यह कई पुस्तकालय का उपयोग करता है:
कार्यक्रम को और विकसित करने के लिए आवश्यक बातें (आवश्यक पैकेज के डॉक्टर के अलावा):
- अजगर पुस्तकालय: एसिंसीओ, जोसन और urllib.parse
- css चयनकर्ता ( mdn वेब डॉक्स ), कुछ html भी। यह भी देखें कि इस लेख जैसे अपने ब्राउज़र पर सीएसएस चयनकर्ता का उपयोग कैसे करें
यह काम किस प्रकार करता है:
- सबसे पहले मैं एक simple html downloader बनाता हूँ। यह aiohttp doc पर दिए गए नमूने से संशोधित संस्करण है।
- उसके बाद सरल कमांड लाइन पार्सर बना रहा है जो उपयोगकर्ता नाम और आउटपुट फ़ाइल नाम स्वीकार करता है।
- थ्रेड लिंक और मुख्य लेख के लिए एक पार्सर बनाएं। पीडीबी और सरल यूआरएल हेरफेर का उपयोग करके काम करना चाहिए।
- फ़ंक्शन को मिलाएं और मुख्य लेख को json पर रखें, इसलिए अन्य प्रोग्राम इसे बाद में संसाधित कर सकते हैं।
कुछ विचार तो इसे और विकसित किया जा सकता है
- दिनांक मॉड्यूल लिंक को स्वीकार करने वाला एक और उपकमांड बनाएं: यह तिथि मॉड्यूल को अपने स्वयं के फ़ंक्शन के लिए पार्स करने की विधि को अलग करके और इसे नए उपकमांड के साथ जोड़कर किया जा सकता है।
- दिनांक मॉड्यूल लिंक को कैशिंग करें: थ्रेड लिंक प्राप्त करने के बाद कैश जॅसन फाइल बनाएं। इसलिए प्रोग्राम को लिंक को फिर से पार्स करने की आवश्यकता नहीं है। या यहां तक कि अगर यह मेल नहीं खाता है तो भी पूरे मुख्य लेख को कैश करें
यह सबसे सुरुचिपूर्ण उत्तर नहीं है, लेकिन मुझे लगता है कि यह बैश उत्तर का उपयोग करने से बेहतर है।
- यह पायथन का उपयोग करता है, जिसका अर्थ है कि यह क्रॉस प्लेटफॉर्म का उपयोग किया जा सकता है।
- सरल स्थापना, सभी आवश्यक पैकेज को पाइप का उपयोग करके स्थापित किया जा सकता है
- इसे और विकसित किया जा सकता है, अधिक पठनीय कार्यक्रम, आसान इसे विकसित किया जा सकता है।
- यह केवल 13 मिनट के लिए बैश स्क्रिप्ट के समान काम करता है ।
sudo apt install python3-bs4 python3-click python3-aiohttp python3-async
लेकिन मुझे नहीं मिल रहा है - किस पैकेज सेasync_timeout
आता है?