龙空技术网

python 爬虫小白入门(下)

技术space 91

前言:

当前各位老铁们对“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