本站源码全部测试通过,配有前台及后台演示图,绿色安全,希望能对大家有所帮助!
  • 收藏本站
  • 网站地图
  • 发布源码
  • 首 页
  • VPS/云主机
  • 交流论坛
  • Python爬虫的三种数据方式-终结篇
    时间:2019-03-15 08:14:44来源:模板之家 作者:转载大师 下载:1933 次
    京峰教育 Python编程学习


    (为了不影响大家微信的正常使用,以及不用忍受腾讯视频的长广告

    公众号内只提供录播的片段

    完整版视频请点击左下角阅读全文观看

    跳转B站无广告哦~)




    完整版视频请点击左下角阅读全文观看



    >>>课堂笔记

    爬虫:

    lxml,re,bs4数据抓取

    按情况来说:


    性能分析------

    bs4:***

    Python开发

    难度:非常简单

    效率:最慢的

    复用性:高


    lxml:*****

    C开发的

    难度:稍微简单

    效率:第二快

    复用性:高

    re:****

    难度:最难的

    效率:最快的

    复用性:差

    兼容性高一些


    robots.txt 爬虫限制

    标准库

    robotparser

    from urllib.robotparser import *

    rp = RobotFileParser()

    rp.set_url(robots.txt_path)

    rp.read()

    user_agent

    url 

    rp.can_fetch()

    sitemap.xml 站点地图

    xml模块



    >>>测试源码


    from urllib.request import urlopen,Request,urlparse,ProxyHandler,build_opener,install_opener
    from urllib.error import URLError,HTTPError
    from datetime import datetime
    import time
    import re
    from bs4 import BeautifulSoup
    import lxml.html

    FIELDS = [链接地址,职位月薪, 工作地点, 发布日期, 工作性质, 工作经验, 最低学历, 招聘人数, 职位类别]

    def download(url,proxy=None,user_agent=wswp,num_retries=2):
       print([+] 正在下载: %s % url)
       headers = { User-Agent:user_agent}
       req = Request(url, headers=headers)
       if proxy:
           handler = {urlparse(url).scheme:proxy}
           opener= build_opener(handler)
           install_opener(opener)
       try:
           html = urlopen(req).read().decode()
       except HTTPError as e:
           html = None
           print([W] 下载出现服务器错误: %s % e.reason)
           if num_retries > 0:
               print([+] 尝试重新下载 第%d次 % (3 - num_retries))
               if hasattr(e,code) and 500 <= e.code < 600:
                   html = download(url,user_agent=user_agent,num_retries=num_retries-1)
           else:
               print([E] 尝试重新下载失败)
       except URLError as e:
           html = None
           print("[E] 站点不可达: %s" % e.reason)
       return html

    def re_scraper(url,html):
       data = re.findall(<li><span>[u4e00-u9fa5.:s]+</span>.*?>([a-zA-Z/u4e00-u9fa5::ds/-]+).*?>,html)
       data.insert(0,url)
       clear_data = dict(zip(FIELDS,data))
       return clear_data

    def bs4_scraper(url,html):
       bs4_obj = BeautifulSoup(html,lxml)
       data = bs4_obj.find(ul,{class:terminal-ul clearfix}).findAll(strong)
       data = [det.get_text().strip() for det in data]
       data.insert(0,url)
       clear_data = dict(zip(FIELDS,data))
       return clear_data

    def lxml_scraper(url,html):
       lxml_obj = lxml.html.fromstring(html)
       data = lxml_obj.cssselect(ul.clearfix > li > strong)
       data = [det.text_content().strip() for det in data ]
       data.insert(0,url)
       clear_data = dict(zip(FIELDS,data))
       return clear_data

    url = http://jobs.zhaopin.com/449193880250014.htm
    html = download(url)

    TEST_NUM = 1000#我将对一个网页进行1000次的数据分析

    fc_ = {re:re_scraper,bs4:bs4_scraper,lxml:lxml_scraper}

    #time.time()当前的linux时间 1970/1/1 秒为单位
    for fc in fc_:
       #fc key值字符串
       #fc_[fc] 函数
       #1970年可称为UNIX元年
       start = time.time()
       for i in range(TEST_NUM):
           if fc_[fc] == re_scraper:#如果是正则的抓取函数
               re.purge()#清理掉正则的编译缓存
               #正则要快
           fc_[fc](url,html)
       end = time.time()
       print(%s: %.2f sec % (fc,end-start))


    >>>完整版代码

    from urllib.request import urlopen,Request,urlparse,ProxyHandler,build_opener,install_opener
    from urllib.error import URLError,HTTPError
    from datetime import datetime
    import time
    import re
    from bs4 import BeautifulSoup
    import lxml.html
    from urllib.robotparser import *

    FIELDS = [链接地址,职位月薪, 工作地点, 发布日期, 工作性质, 工作经验, 最低学历, 招聘人数, 职位类别]

    class Throttle:
       def __init__(self,time_sleep):
           self.time_sleep = time_sleep
           self.url_time = {}
       def wait(self,url):
           domain = urlparse(url).netloc
           last_time = self.url_time.get(domain)
           if self.time_sleep > 0 and last_time is not None:
               sleep_time = self.time_sleep - (datetime.now() - last_time).seconds
               if sleep_time > 0:
                   print([+] 休息: %ds % sleep_time)
                   time.sleep(sleep_time)
               else:
                   print("[+] 无需休息")
           self.url_time[domain] = datetime.now()

    def download(url,proxy=None,user_agent=wswp,num_retries=2):
       print([+] 正在下载: %s % url)
       headers = { User-Agent:user_agent}
       req = Request(url, headers=headers)
       if proxy:
           handler = {urlparse(url).scheme:proxy}
           opener= build_opener(handler)
           install_opener(opener)
       try:
           html = urlopen(req).read().decode()
       except HTTPError as e:
           html = None
           print([W] 下载出现服务器错误: %s % e.reason)
           if num_retries > 0:
               print([+] 尝试重新下载 第%d次 % (3 - num_retries))
               if hasattr(e,code) and 500 <= e.code < 600:
                   html = download(url,user_agent=user_agent,num_retries=num_retries-1)
           else:
               print([E] 尝试重新下载失败)
       except URLError as e:
           html = None
           print("[E] 站点不可达: %s" % e.reason)
       return html

    def get_links(html):
       webpage_regex = re.compile(<a[^>]+href=["](.*?)["], re.IGNORECASE)
       return webpage_regex.findall(html)

    def link_crawler(home_url,link_regex,scrape_callback=None,time_sleep=0,depth_regex=None,max_depth=-1):
       crawl_queue = [home_url]
       seen = {home_url:0}
       throttle = Throttle(time_sleep)
       while crawl_queue:
           url = crawl_queue.pop(0)
           depth = seen[url]
           if depth != max_depth:
               if get_robots(home_url,url):
                   throttle.wait(url)
                   html = download(url)
                   if depth_regex and re.match(re.compile(depth_regex,re.IGNORECASE),url):
                       if scrape_callback:
                           scrape_callback(url,html)
                       continue

                   for link in get_links(html):
                       if re.match(re.compile(link_regex,re.IGNORECASE),link) and link not in seen:
                           seen[link] = depth + 1
                           crawl_queue.append(link)
               else:
                   print([E] Un Access URL: %s % url)


    def re_scraper(url,html):
       data = re.findall(<li><span>[u4e00-u9fa5.:s]+</span>.*?>([a-zA-Z/u4e00-u9fa5::ds/-]+).*?>,html)
       data.insert(0,url)
       clear_data = dict(zip(FIELDS,data))
       print(clear_data)

    def bs4_scraper(url,html):
       bs4_obj = BeautifulSoup(html,html.parser)
       data = bs4_obj.find(ul,{class:terminal-ul clearfix}).findAll(strong)
       data = [det.get_text().strip() for det in data]
       data.insert(0,url)
       clear_data = dict(zip(FIELDS,data))
       print(clear_data)


    def lxml_scraper(url,html):
       lxml_obj = lxml.html.fromstring(html)
       data = lxml_obj.cssselect(ul.clearfix > li > strong)
       data = [det.text_content().strip() for det in data ]
       data.insert(0,url)
       clear_data = dict(zip(FIELDS,data))
       print(clear_data)

    def Scrape_callback(choice=re):
       fc_ = {re:re_scraper,bs4:bs4_scraper,lxml:lxml_scraper}
       if fc_.get(choice):
           return fc_.get(choice)

    def get_robots(home_url,url,user_agent=wswp):
       rp = RobotFileParser()
       rp.set_url(home_url + /robots.txt)
       rp.read()
       return rp.can_fetch(user_agent,url)

    url = https://www.zhaopin.com/static/analytics.js
    #home_url = https://www.zhaopin.com
    #url = http://sou.zhaopin.com/jobs/searchresult.ashx?jl=%E5%8C%97%E4%BA%AC&kw=python%E7%88%AC%E8%99%AB&p=1&isadv=0  
    depth_regex = http://jobs.zhaopin.com/[d]{15}.htm
    link_regex = (http://jobs.zhaopin.com/[d]{15}.htm|http://sou.zhaopin.com/jobs/searchresult.ashx?jl=%E5%8C%97%E4%BA%AC&kw=Python)
    link_crawler(url,link_regex=link_regex,depth_regex=depth_regex,scrape_callback=Scrape_callback(choice=re))







    有不懂处可在文章下方留言,老师会回复的哦~



      阅读原文

      发送中

      阅读原文
      转载请注明来源: Python爬虫的三种数据方式-终结篇
      本文永久链接地址:bencandy.php?fid=3&id=5586
      本文标签:

      版权声明:
      —— 本文内容由互联网用户自发贡献, 本站不拥有所有权, 不承担相关法律责任, 如果发现本站有涉嫌抄袭的内容, 欢迎发送邮件至 :
      —— 1034252225@qq.com 举报, 并提供相关证据, 一经查实, 本站将立刻删除涉嫌侵权内容。

      最新《系统天堂》软件下载站门户整站程序源码 带WAP手机端+全最新《系统天堂》软件下载站门户整站程序源码 带WAP手机端+全
      福娃源码交易平台,VIP会员,友价T5内核,可运营版本福娃源码交易平台,VIP会员,友价T5内核,可运营版本
      最新仿酷趣商业源码交易平台完整源码,带任务平台功能,新闻栏最新仿酷趣商业源码交易平台完整源码,带任务平台功能,新闻栏
      推荐资讯

      开源之家:最新微信收银系统程序(刷卡支付、卡券核销、扫码支付

      开源之家:最新微信收银系统程序(刷卡支付、卡券核销、扫码支付微信源码3415

      最新微信全民经纪人系统V3.0完整商业版

      最新微信全民经纪人系统V3.0完整商业版微信源码3415

      星火草原微信三级分销系统云指分销商城完美修复版二次开发源码

      星火草原微信三级分销系统云指分销商城完美修复版二次开发源码微信源码3415

      最新牛NIUCMS本地O2O系统V3.0商业版源码二次开发版微信完美三

      最新牛NIUCMS本地O2O系统V3.0商业版源码二次开发版微信完美三微信源码3415

      最新销客多V3.5三级分销系统二次开发版修复物流公司BUG支持佣

      最新销客多V3.5三级分销系统二次开发版修复物流公司BUG支持佣微信源码3415
      开源之家广告栏目A
      热点资讯

      最新《系统天堂》软件下载站门户整站程序源码 带WAP手机端+全

      最新《系统天堂》软件下载站门户整站程序源码 带WAP手机端+全下载系统6481

      福娃源码交易平台,VIP会员,友价T5内核,可运营版本

      福娃源码交易平台,VIP会员,友价T5内核,可运营版本下载系统6481

      最新仿酷趣商业源码交易平台完整源码,带任务平台功能,新闻栏

      最新仿酷趣商业源码交易平台完整源码,带任务平台功能,新闻栏下载系统6481

      mobanbox素材网源码,素材图片站系统,类似千图网源码,高端响应

      mobanbox素材网源码,素材图片站系统,类似千图网源码,高端响应下载系统6481

      2017年10.20更新友价T5源码素材交易网站源码|虚拟物品交易商城

      2017年10.20更新友价T5源码素材交易网站源码|虚拟物品交易商城下载系统6481
      开源之家广告栏目B
      开源之家广告栏目C