2023年6月29日发(作者:)
3.⽹络爬⾍的组成结构(⼀个爬⾍框架)⼀个⽹络爬⾍的组成结构:1. 爬⾍调度程序(程序的⼊⼝,⽤于启动整个程序)2. url管理器(⽤于管理未爬取得url及已经爬取过的url)3. ⽹页下载器(⽤于下载⽹页内容⽤于分析)4. ⽹页解析器(⽤于解析下载的⽹页,获取新的url和所需内容)5. ⽹页输出器(⽤于把获取到的内容以⽂件的形式输出)⼀、审查元素在浏览器的地址栏输⼊URL地址,在⽹页处右键单击,找到检查。(不同浏览器的叫法不同,Chrome浏览器叫做检查,Firefox浏览器叫做查看元素,但是功能都是相同的)通过修改服务器返回的HTML信息。我们每个⼈都是"整容⼤师",可以修改页⾯信息。我们在页⾯的哪个位置点击审查元素,浏览器就会为我们定位到相应的HTML位置,进⽽就可以在本地更改HTML信息。举个例⼦:我们都知道,使⽤浏览器"记住密码"的功能,密码会变成⼀堆⼩⿊点,是不可见的。可以让密码显⽰出来吗?可以,以淘宝为例,在输⼊密码框处右键,点击检查。浏览器为我们⾃动定位到了相应的HTML位置。将下图中的password属性值改为text属性值(直接在右侧代码处修改):我们让浏览器记住的密码就这样显现出来了浏览器就是作为客户端从服务器端获取信息,然后将信息解析,并展⽰给我们的。我们可以在本地修改HTML信息,为⽹页"整容",但是我们修改的信息不会回传到服务器,服务器存储的HTML信息不会改变。刷新⼀下界⾯,页⾯还会回到原本的样⼦。这就跟⼈整容⼀样,我们能改变⼀些表⾯的东西,但是不能改变我们的基因。⼆.编写爬⾍调度程序这⾥的bike_spider是项⽬名称引⼊的四个类分别对应下⾯的四段代码url管理器,url下载器,url解析器,url输出器。#
爬⾍调度程序from bike_spider import url_manager, html_downloader, html_parser, html_outputer
#
爬⾍初始化class SpiderMain(object): def __init__(self): = url_ager() ader = html_wnloader() = html_rser() er = html_tputer()
def craw(self, my_root_url): count = 1 _new_url(my_root_url) while _new_url(): try: new_url = _new_url() print("craw %d : %s" % (count, new_url)) #
下载⽹页 html_cont = ad(new_url) #
解析⽹页 new_urls, new_data = (new_url, html_cont) _new_urls(new_urls) #
⽹页输出器收集数据 t_data(new_data) if count == 10: break count += 1 except: print("craw failed")
_html()
if __name__ == "__main__": root_url = "/item/Python/407313" obj_spider = SpiderMain() obj_(root_url)三.编写url管理器我们把已经爬取过的url和未爬取的url分开存放以便我们不会重复爬取某些已经爬取过的⽹页。# url管理器class UrlManager(object): def __init__(self): _urls = set() _urls = set()
def add_new_url(self, url): if url is None: return if url not in _urls and url not in _urls: _(url)
def add_new_urls(self, urls): if urls is None or len(urls) == 0: return for url in urls: _(url)
def get_new_url(self): # pop⽅法会帮我们获取⼀个url并且移除它 new_url = _() _(new_url) return new_url
def has_new_url(self): return len(_urls) != 0四.编写⽹页下载器通过⽹络请求来下载页⾯#
⽹页下载器import t
class HtmlDownloader(object):
def download(self, url): if url is None: return None response = n(url) # code不为200则请求失败 if e() != 200: return None return ()五.编写⽹页解析器对⽹页进⾏解析时我们需要知道我们要查询的内容都有哪些特征,我们可以打开⼀个⽹页点击右键审查元素来了解我们所查内容的共同之处。#
⽹页解析器import refrom bs4 import BeautifulSoupfrom import urljoin
class HtmlParser(object):
def parse(self, page_url, html_cont): if page_url is None or html_cont is None: return soup = BeautifulSoup(html_cont, "", from_encoding="utf-8") new_urls = self._get_new_urls(page_url, soup) new_data = self._get_new_data(page_url, soup) return new_urls, new_data
def _get_new_data(self, page_url, soup): res_data = {"url": page_url} #
获取标题 title_node = ("dd", class_="lemmaWgt-lemmaTitle-title").find("h1") res_data["title"] = title__text() summary_node = ("div", class_="lemma-summary") res_data["summary"] = summary__text() return res_data
def _get_new_urls(self, page_url, soup): new_urls = set() #
查找出所有符合下列条件的url links = _all("a", href=e(r"/item/")) for link in links: new_url = link['href'] #
获取到的url不完整,学要拼接 new_full_url = urljoin(page_url, new_url) new_(new_full_url) return new_urls六.编写⽹页输出器输出的格式有很多种,我们选择以html的形式输出,这样我们可以的到⼀个html页⾯。#
⽹页输出器class HtmlOutputer(object):
def __init__(self): = []
def collect_data(self, data): if data is None: return (data)
#
我们以html表格形式进⾏输出 def output_html(self): fout = open("", "w", encoding='utf-8') ("") ("") ("
") #以表格输出 ("
%s | " % data["url"]) ("%s | " % data["title"]) ("%s | " % data["summary"]) ("
输出完毕后⼀定要关闭输出器 ()
发布者:admin,转转请注明出处:http://www.yc00.com/web/1687982034a63458.html
评论列表(0条)