前言:
当前各位老铁们对“cssfout”大体比较看重,咱们都想要知道一些“cssfout”的相关知识。那么小编在网络上网罗了一些关于“cssfout””的相关文章,希望看官们能喜欢,小伙伴们一起来了解一下吧!一、前言
上两篇爬虫文章(Python 爬虫小白入门(中) python 爬虫小白入门(上) )我讲解了一些简单的爬虫知识,今天我结合网络请求流程,实现一个基本的爬虫架构。朋友们可以根据这个架构代码,对自己的爬虫需求进行拓展。
二、项目结构
code_space_spider_demo ├─html_downloader.py 网页下载器 ├─html_outputer.py 数据处理器 ├─html_parser.py 网页解析器 ├─output.html 数据展示html ├─spider_main.py 爬虫启动器 ├─urls_manager.py URL管理器三、代码实现
案例:模拟爬取新闻的需求,以郑州轻工业大学新闻网的新闻为例进行测试。
目标:爬取100条左右新闻数据。
URL管理器
# 待爬取集合new_urls = set()# 已爬取集合old_urls = set()def add_new_url(url): ''' 添加新URL到待爬取集合中 input: url output: 无 ''' new_urls.add(url)def add_new_urls(urls): ''' 一次性添加多个URLs到待爬取集合中 input: urls output: 无 ''' for url in urls: new_urls.add(url)def get_new_url(): ''' 从待爬取集合中获取一个新的待爬取URL input: 无 output: url ''' next_url = new_urls.pop() return next_urldef has_new_url(): ''' 判断是否还有待爬取URL input: 无 output: True or False ''' result = False if new_urls: result = True return result网页下载器
from urllib import requestdef download(url): ''' 下载参数url指示的网页数据,并将网页数据全部返回 input: url output: 网页数据 ''' response = request.urlopen(url) html_cont = response.read().decode("utf-8") return html_cont数据处理器
data_list = []def collect_data(data): data_list.append(data)def output_html(): fout = open('output.html', 'w', encoding='utf-8') fout.write('<html>') fout.write('<head><meta charset="utf-8"></head>') fout.write('<body>') fout.write('<table>') for dataitem in data_list: try: fout.write('<tr>') fout.write('<td>%s</td>' % dataitem['url']) fout.write('<td>%s</td>' % dataitem['title']) fout.write('<td>%s</td>' % dataitem['datetime']) fout.write('<td>%s</td>' % dataitem['visitcount']) fout.write('</tr>') except BaseException as e: print("新闻《" + dataitem['title'] + "》写入失败") print(e) fout.write('</table>') fout.write('</body>') fout.write('</html>') fout.close()网页解析器
import refrom bs4 import BeautifulSoupfrom urllib.parse import urljoinfrom os.path import basenamefrom urllib.parse import urlparsedef get_new_urls(page_url, soup): ''' 从当前正在爬取的页面上提取所有目标URLs input: page_url -> 当前正在爬取的页面的URL soup -> 当前正在爬取的页面数据的BeautifulSoup对象 output: 所有目标URLs ''' tag_urls = soup.select('span.column-news-title a') new_urls = [] prefix_url = get_prefix_url(page_url) for tag in tag_urls: new_url = tag.get("href") if new_url is not None: new_urls.append(prefix_url + new_url) return new_urlsdef get_new_data(page_url, soup): ''' 从当前正在爬取的页面上提取目标信息(新闻标题,日期时间,访问次数) input: page_url -> 当前正在爬取的页面的URL soup -> 当前正在爬取的页面数据的BeautifulSoup对象 output: res_data -> 字典类型,包含url, title, datetime, visitcount这四个键 ''' title = soup.select_one('h1.arti-title').get_text() datetime = soup.select_one("span.arti-update").get_text().replace("时间:", "") visitcount = soup.select_one("span.WP_VisitCount").get_text() res_data = {"url": page_url, "title": title, "datetime": datetime, "visitcount": visitcount} return res_datadef parse(page_url, html_cont): if page_url is None or html_cont is None: return soup = BeautifulSoup(html_cont, 'html.parser', from_encoding='utf-8') new_urls = get_new_urls(page_url, soup) new_data = get_new_data(page_url, soup) return new_urls, new_datadef get_prefix_url(page_url): ''' 从当前爬取的url解析出网站域名链接 input: page_url -> 当前正在爬取的页面的URL output: 网站域名链接 ''' hostname = urlparse(page_url).netloc prefix_url = urlparse(page_url).scheme + "://" + hostname return prefix_url爬虫启动器
import urls_managerimport html_downloaderimport html_parserimport html_outputerfrom bs4 import BeautifulSoupdef craw(root_url): ''' 1.爬取新闻页面,限定爬取100条新闻即可 2.爬取并提取页面信息后,以html文件的形式输出 ''' limit = 1 while len(html_outputer.data_list) < 100: html_cont = html_downloader.download(root_url) soup = BeautifulSoup(html_cont, 'html.parser', from_encoding='utf-8') new_urls = html_parser.get_new_urls(root_url, soup) urls_manager.add_new_urls(new_urls) while urls_manager.has_new_url(): new_url = urls_manager.get_new_url() html_cont = html_downloader.download(new_url) soup = BeautifulSoup(html_cont, 'html.parser', from_encoding='utf-8') new_data = html_parser.get_new_data(new_url, soup) html_outputer.collect_data(new_data) limit = limit + 1 root_url = '; + str(limit) + '.htm' html_outputer.output_html()if __name__ == '__main__': root_url = '; new_data_list = craw(root_url)数据展示html
收集效果:
关注我,坚持每日积累一个技巧,长期坚持,我们将会不断进步。
#程序员##python##爬虫##计算机##互联网#
标签: #cssfout