7.robotparser:理会robots.txt的器材。
- >>> from urllib import robotparser
- >>> parser = robotparser.RobotFileParser()
- >>> parser.set_url('https://www.taobao.com/robots.txt')
- >>> parser.read()
- >>> parser.can_fetch('Hellokitty', 'http://www.taobao.com/article')
- False
- >>> parser.can_fetch('Baiduspider', 'http://www.taobao.com/article')
- True
- >>> parser.can_fetch('Baiduspider', 'http://www.taobao.com/product')
- False
一个简朴的爬虫
一个根基的爬虫凡是分为数据收罗(网页下载)、数据处理赏罚(网页理会)和数据存储(将有效的信息耐久化)三个部门的内容,虽然更为高级的爬虫在数据收罗和处理赏罚时会行使并发编程或漫衍式技能,这就必要有调治器(布置线程或历程执行对应的使命)、靠山打点措施(监控爬虫的事变状态以及搜查数据抓取的功效)等的参加。
![2019 收集爬虫和相干器材](http://img25.aspzz.cn/uploads/allimg/c190611/156022N122Q20-U115.jpg)
一样平常来说,爬虫的事变流程包罗以下几个步调:
- 设定抓取方针(种子页面/起始页面)并获取网页。
- 当处事器无法会见时,凭证指定的重试次数实行从头下载页面。
- 在必要的时辰配置用户署理或潜匿真实IP,不然也许无法会见页面。
- 对获取的页面举办须要的解码操即使后抓取出必要的信息。
- 在获取的页面中通过某种方法(如正则表达式)抽取出页面中的链接信息。
- 对链接举办进一步的处理赏罚(获取页面并一再上面的举措)。
- 将有效的信息举办耐久化以备后续的处理赏罚。
下面的例子给出了一个从“搜狐体育”上获取NBA消息问题和链接的爬虫。
- from urllib.error import URLError
- from urllib.request import urlopen
-
- import re
- import pymysql
- import ssl
-
- from pymysql import Error
-
-
- # 通过指定的字符集对页面举办解码(不是每个网站都将字符集配置为utf-8)
- def decode_page(page_bytes, charsets=('utf-8',)):
- page_html = None
- for charset in charsets:
- try:
- page_html = page_bytes.decode(charset)
- break
- except UnicodeDecodeError:
- pass
- # logging.error('Decode:', error)
- return page_html
-
-
- # 获取页面的HTML代码(通过递归实现指定次数的重试操纵)
- def get_page_html(seed_url, *, retry_times=3, charsets=('utf-8',)):
- page_html = None
- try:
- page_html = decode_page(urlopen(seed_url).read(), charsets)
- except URLError:
- # logging.error('URL:', error)
- if retry_times > 0:
- return get_page_html(seed_url, retry_times=retry_times - 1,
- charsets=charsets)
- return page_html
-
-
- # 从页面中提取必要的部门(凡是是链接也可以通过正则表达式举办指定)
- def get_matched_parts(page_html, pattern_str, pattern_ignore_case=re.I):
- pattern_regex = re.compile(pattern_str, pattern_ignore_case)
- return pattern_regex.findall(page_html) if page_html else []
-
-
- # 开始执行爬虫措施并对指定的数据举办耐久化操纵
- def start_crawl(seed_url, match_pattern, *, max_depth=-1):
- conn = pymysql.connect(host='localhost', port=3306,
- database='crawler', user='root',
- password='123456', charset='utf8')
- try:
- with conn.cursor() as cursor:
- url_list = [seed_url]
- # 通过下面的字典停止一再抓取并节制抓取深度
- visited_url_list = {seed_url: 0}
- while url_list:
- current_url = url_list.pop(0)
- depth = visited_url_list[current_url]
- if depth != max_depth:
- # 实行用utf-8/gbk/gb2312三种字符集举办页面解码
- page_html = get_page_html(current_url, charsets=('utf-8', 'gbk', 'gb2312'))
- links_list = get_matched_parts(page_html, match_pattern)
- param_list = []
- for link in links_list:
- if link not in visited_url_list:
- visited_url_list[link] = depth + 1
- page_html = get_page_html(link, charsets=('utf-8', 'gbk', 'gb2312'))
- headings = get_matched_parts(page_html, r'<h1>(.*)<span')
- if headings:
- param_list.append((headings[0], link))
- cursor.executemany('insert into tb_result values (default, %s, %s)',
- param_list)
- conn.commit()
- except Error:
- pass
- # logging.error('SQL:', error)
- finally:
- conn.close()
-
-
- def main():
- ssl._create_default_https_context = ssl._create_unverified_context
- start_crawl('http://sports.sohu.com/nba_a.shtml',
- r'<a[^>]+test=as[^>]*href=["'](.*?)["']',
- max_depth=2)
-
-
- if __name__ == '__main__':
- main()
因为行使了MySQL实现耐久化操纵,以是要先启动MySQL处事器再运行该措施。 (编辑:河北网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|