加入收藏 | 设为首页 | 会员中心 | 我要投稿 河北网 (https://www.hebeiwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

2019 收集爬虫和相干器材

发布时间:2019-06-14 16:56:59 所属栏目:建站 来源:微笑的蚂蚁人
导读:收集爬虫 收集爬虫(web crawler),早年常常称之为收集蜘蛛(spider),是凭证必然的法则自动赏识万维网并获守信息的呆板人措施(或剧本),曾经被普及的应用于互联网搜刮引擎。行使过互联网和赏识器的人都知道,网页中除了供用户阅读的笔墨信息之外,还包括一

7.robotparser:理会robots.txt的器材。

  1. >>> from urllib import robotparser 
  2. >>> parser = robotparser.RobotFileParser() 
  3. >>> parser.set_url('https://www.taobao.com/robots.txt') 
  4. >>> parser.read() 
  5. >>> parser.can_fetch('Hellokitty', 'http://www.taobao.com/article') 
  6. False 
  7. >>> parser.can_fetch('Baiduspider', 'http://www.taobao.com/article') 
  8. True 
  9. >>> parser.can_fetch('Baiduspider', 'http://www.taobao.com/product') 
  10. False 

一个简朴的爬虫

一个根基的爬虫凡是分为数据收罗(网页下载)、数据处理赏罚(网页理会)和数据存储(将有效的信息耐久化)三个部门的内容,虽然更为高级的爬虫在数据收罗和处理赏罚时会行使并发编程或漫衍式技能,这就必要有调治器(布置线程或历程执行对应的使命)、靠山打点措施(监控爬虫的事变状态以及搜查数据抓取的功效)等的参加。

2019 收集爬虫和相干器材

一样平常来说,爬虫的事变流程包罗以下几个步调:

  1. 设定抓取方针(种子页面/起始页面)并获取网页。
  2. 当处事器无法会见时,凭证指定的重试次数实行从头下载页面。
  3. 在必要的时辰配置用户署理或潜匿真实IP,不然也许无法会见页面。
  4. 对获取的页面举办须要的解码操即使后抓取出必要的信息。
  5. 在获取的页面中通过某种方法(如正则表达式)抽取出页面中的链接信息。
  6. 对链接举办进一步的处理赏罚(获取页面并一再上面的举措)。
  7. 将有效的信息举办耐久化以备后续的处理赏罚。

下面的例子给出了一个从“搜狐体育”上获取NBA消息问题和链接的爬虫。

  1. from urllib.error import URLError 
  2. from urllib.request import urlopen 
  3.  
  4. import re 
  5. import pymysql 
  6. import ssl 
  7.  
  8. from pymysql import Error 
  9.  
  10.  
  11. # 通过指定的字符集对页面举办解码(不是每个网站都将字符集配置为utf-8) 
  12. def decode_page(page_bytes, charsets=('utf-8',)): 
  13.     page_html = None 
  14.     for charset in charsets: 
  15.         try: 
  16.             page_html = page_bytes.decode(charset) 
  17.             break 
  18.         except UnicodeDecodeError: 
  19.             pass 
  20.             # logging.error('Decode:', error) 
  21.     return page_html 
  22.  
  23.  
  24. # 获取页面的HTML代码(通过递归实现指定次数的重试操纵) 
  25. def get_page_html(seed_url, *, retry_times=3, charsets=('utf-8',)): 
  26.     page_html = None 
  27.     try: 
  28.         page_html = decode_page(urlopen(seed_url).read(), charsets) 
  29.     except URLError: 
  30.         # logging.error('URL:', error) 
  31.         if retry_times > 0: 
  32.             return get_page_html(seed_url, retry_times=retry_times - 1, 
  33.                                  charsets=charsets) 
  34.     return page_html 
  35.  
  36.  
  37. # 从页面中提取必要的部门(凡是是链接也可以通过正则表达式举办指定) 
  38. def get_matched_parts(page_html, pattern_str, pattern_ignore_case=re.I): 
  39.     pattern_regex = re.compile(pattern_str, pattern_ignore_case) 
  40.     return pattern_regex.findall(page_html) if page_html else [] 
  41.  
  42.  
  43. # 开始执行爬虫措施并对指定的数据举办耐久化操纵 
  44. def start_crawl(seed_url, match_pattern, *, max_depth=-1): 
  45.     conn = pymysql.connect(host='localhost', port=3306, 
  46.                            database='crawler', user='root', 
  47.                            password='123456', charset='utf8') 
  48.     try: 
  49.         with conn.cursor() as cursor: 
  50.             url_list = [seed_url] 
  51.             # 通过下面的字典停止一再抓取并节制抓取深度 
  52.             visited_url_list = {seed_url: 0} 
  53.             while url_list: 
  54.                 current_url = url_list.pop(0) 
  55.                 depth = visited_url_list[current_url] 
  56.                 if depth != max_depth: 
  57.                     # 实行用utf-8/gbk/gb2312三种字符集举办页面解码 
  58.                     page_html = get_page_html(current_url, charsets=('utf-8', 'gbk', 'gb2312')) 
  59.                     links_list = get_matched_parts(page_html, match_pattern) 
  60.                     param_list = [] 
  61.                     for link in links_list: 
  62.                         if link not in visited_url_list: 
  63.                             visited_url_list[link] = depth + 1 
  64.                             page_html = get_page_html(link, charsets=('utf-8', 'gbk', 'gb2312')) 
  65.                             headings = get_matched_parts(page_html, r'<h1>(.*)<span') 
  66.                             if headings: 
  67.                                 param_list.append((headings[0], link)) 
  68.                     cursor.executemany('insert into tb_result values (default, %s, %s)', 
  69.                                        param_list) 
  70.                     conn.commit() 
  71.     except Error: 
  72.         pass 
  73.         # logging.error('SQL:', error) 
  74.     finally: 
  75.         conn.close() 
  76.  
  77.  
  78. def main(): 
  79.     ssl._create_default_https_context = ssl._create_unverified_context 
  80.     start_crawl('http://sports.sohu.com/nba_a.shtml', 
  81.                 r'<a[^>]+test=as[^>]*href=["'](.*?)["']', 
  82.                 max_depth=2) 
  83.  
  84.  
  85. if __name__ == '__main__': 
  86.     main() 

因为行使了MySQL实现耐久化操纵,以是要先启动MySQL处事器再运行该措施。

(编辑:河北网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读