python_python3 - CSDN
python 订阅
Python是一种跨平台的计算机程序设计语言。 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越多被用于独立的、大型项目的开发。 展开全文
Python是一种跨平台的计算机程序设计语言。 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越多被用于独立的、大型项目的开发。
信息
缩    写
py
作    者
Guido van Rossum
最新版本
稳定:3x:3.8.3 2x:2.7.18;测试:3.9.0a6 2.x:2.7.18rc1 [1]
最近更新时间
2020年04月28日
别    名
胶水语言
发行时间
1991年
中文名
蟒蛇
经典教材
Head First Python; Automate the Boring Stuff with Python
语言类型
高级语言
荣    誉
2017年度编程语言
外文名
Python
PythonPython简介及应用领域
Python是一种解释型脚本语言,可以应用于以下领域: [2] 
收起全文
  • Python入门视频精讲

    2019-12-20 11:53:16
    Python入门视频培训课程以通俗易懂的方式讲解Python核心技术,Python基础,Python入门。适合初学者的教程,让你少走弯路! 课程内容包括:1.Python简介和安装 、2.第一个Python程序、PyCharm的使用 、3.Python基础...
  • 【为什么学PythonPython 是当今非常热门的语言之一,2020年的 TIOBE 编程语言排行榜中 ,Python名列第一,并且其流行度依然处在上升势头。 在2015年的时候,在网上还经常...
  • 【为什么学爬虫?】      ...1、爬虫入手容易,但是深入较难,如何写出高效率的爬虫,如何写出灵活性高可扩展的爬虫都是一项技术活。另外在爬虫过程中,经常容易遇到被反爬虫,比如字体反爬、IP...
  • 总课时80+,提供源码和相关资料
  • Python学习路线

    2020-02-19 17:29:05
    经历长达近一个月的资源筛选过程终于结束,总共1.5T的资源经过:去重、筛选、整理、归档之后一份粗略的Python学习曲线资源已经成型,虽然中间经历了很多坎坷,不过最终还是完成,猪哥也是第一时间与大家分享出来。...

    此视频资源收集于网络,如有侵权请联系删除!!!
    此视频资源仅用作个人学习,请勿用于商业获利,造成后果自负!!!

    经历长达近一个月的资源筛选过程终于结束,总共1.5T百度网盘的资源经过:去重、筛选、整理、归档之后一份粗略的Python学习曲线资源已经成型,虽然中间经历了很多坎坷,不过最终还是完成,猪哥也是第一时间与大家分享出来。
    在这里插入图片描述
    资料主要分为两部分:一、各个学习网站论坛等,二、百度云资料。网站论坛资源更新快,可以与大家互动;而百度云资源主要为视频,方便大家下载和在线观看,两种资源结合使用,学习和查找知识更方便!

    一、网站论坛学习资源

    名称 链接 说明
    实验楼 https://www.shiyanlou.com 提供免费的Linux实验环境
    Py资源中文大全 http://t.cn/Rq0C0ET 各种python包和管理工具
    PEP8 Py编码规范中文版 https://dwz.cn/30uIzs9W 代码规范与基础同样重要
    Py Code Examples https://dwz.cn/dawtruYk 精细到方法级别的代码案例
    Py Module of the Week https://pymotw.com 每篇介绍一个 Py标准库的使用
    菜鸟教程 http://t.cn/RLGeMuW 最经典的一个语言教程网站
    廖雪峰Py教程 https://dwz.cn/drygpxjk 大牛带你简单快速入门
    Py自动化测试博客 https://dwz.cn/raopItkV 一个自动化测试大佬的博客
    Py中文学习大本营 http://www.pythondoc.com 一个不错的Flask学习网站
    刘江的Django https://dwz.cn/udQayyZY 最适合入门的Django教程
    莫烦Py https://morvanzhou.github.io 机器学习方面有着不错的造诣
    吴恩达机器学习 https://dwz.cn/F8Aad3DY 网易云课堂(中/英字幕)
    几个Py练习题 https://dwz.cn/ExJnmwOJ 有几个不错的实用练习题
    CheckiO https://py.checkio.org/ 一个学习Py的有趣网站

    二、学习曲线

    这个学习曲线是我在某马论坛上看到的,觉得不错就推荐给大家,同时也感谢某马的开源免费精神,猪哥也是受益颇多!
    在这里插入图片描述
    在这里插入图片描述

    三、优质资源

    我把这些资源分为了七个不同的阶段,难度是依次递增,其实就是对应上面学习曲线图;

    本资源一共800G,永久保存,并且会持续更新,建议大家转发收藏,方便以后查找学习;
    在这里插入图片描述
    这是猪哥推荐的Python学习曲线,基本上是某马的视频教程,这个学习曲线适合零基础的同学:
    在这里插入图片描述

    四、获取方式

    1. 链接:https://pan.baidu.com/s/18gY3J5t2xZPU6zSDWP09RA 密码:j8wk
    2. 如果链接失效,微信扫描下方二维码,关注猪哥微信公众号,回复:学习曲线 即可获取新链接!
      在这里插入图片描述

    五、猪哥有话说

    昨天看到一则新闻“19岁少年培训被坑而自杀”,当时真的很愤怒!!!这也使得猪哥更加坚定的坚持免费分享的原则,如果你觉得此文章好请分享给你的每一位朋友:也许你一个不经意的善意之举,却是他人人生的一个转折点。

    在这里插入图片描述

    展开全文
  • 本文介绍了python从头到尾所需要的工具,如urllib2,requests,beautifulsoup4,Xpath等, 和代码展示,最后实战爬取起点小说网站数据,筛选238本小说,找到高质量的10本小说,途中 遇到的问题及解决方法,及以后...

    一.环境介绍

    1.由于使用惯了Eclipse,我直接在里面装了个pydev,当初装的时候遇到些版本兼容问题,请大家装的时候一定要根据自己python版本来装,我的是python2.7.X,注意在线安装有个小坑,如下图:


    这是自动屏蔽旧版本,如果不注意会装错至最新,除了以上装法,还有就是自己下载,解压到Eclipse安装

    文件的plugins文件下。

    二.python扩展工具包的使用和爬虫整体思路



    1.网页下载器

    可以用py自带的urllib2,直接import使用即可,本文使用扩展的respects来充当下载器(因为功能比较强大,还有其他一些功能,如post),下载方式比较简单,可以用pip命令(本人的不知道怎么用不了,出现奇怪异常)不过可能会撞墙,推荐http://www.lfd.uci.edu/~gohlke/pythonlibs/找到相应的包,把后缀改为ZIP解压到py的Lib中即可。

    2.网页解析器

    主要用2种,都是扩展的(py不自带),beautifulsoup4和xpath,个人感觉后一种好用一点,后面会具体介绍。

    3.URL管理器

    这个是自己用2个Set实现的,一个存放即将使用的URL,一个存放使用过的URL(不然可能在一个网页循环爬取)。


    三.实战爬取起点高质量小说

    1.爬取前的准备

    由于我爬取的是起点的玄幻小说为主,所以我的起始URL为:

    http://book.qidian.com/info/1004608738

    然后观察每个小说的URL 发现都是http://book.qidian.com/info/数字   格式,所以在每个页面URL可以正则匹配,看是否符合格式。

    2.核心代码,主模块

     while self.urls.has_new_url():
                try:
                    #从URL管理器取出URL
                    new_url = self.urls.get_new_url()
                    #输出当前爬取进度
                    print 'craw %d : %s ;success :%d '%(sumcount,new_url,count)
                    #网页下载器获取HTML页面
                    html_cont = self.downloader.download(new_url)
                    #网页解析器获取数据和URL
                    new_urls,new_data = self.parser.parse(new_url,html_cont.text,word_click_back[0])
                    #将URL添加进URL管理器
                    self.urls.add_new_urls(new_urls)
                    #将数据存放在output中
                    if new_data is not None:
                       count = self.outputer.collect_data(new_data,count,basescore,basewordcount,basewordclick)
                    
                    if count > sum:
                        break
                    sumcount+=1
                    
                except:
                    print 'craw failed' 

    3.网页解析器模块

    (1)2种解析器

    ①beautifulsoup4可以把HTML文件解析成DOM树,可以像访问树一样,通过find方法一层层访问,如

    title_node = soup.find('div',class_="book-info").find("h1").find("em")...

    ②Xpath定位神器,可以直接定位所需信息,结合chrome浏览器的copy Xpath简直不要太简单,下面写Xpath用法

    如下图,匹配一个分数:

    (2).检查



    (3).找到所需标签,右键复制xpath,得到一串匹配字符串


    (4).得到字符串(//*[@id="score1"]),写代码

    html_cont = requests.get(page_url,timeout=0.5)
    selector = etree.HTML(html_cont.text)
    word_count = selector.xpath('//*[@id="score1"]/text()')
    res_data['word_count']=word_count[0]

    (5).贴出解析器核心方法代码(前面使用bs4,后面使用Xpath)

    def _get_new_data(self, page_url, soup,word_click_back):
            res_data = {}
            score = 0
            res_data['url'] = page_url
            #<dd class="lemmaWgt-lemmaTitle-title"> 小说名
            title_node = soup.find('div',class_="book-info").find("h1").find("em")
            res_data['title'] = title_node.get_text()
            #小说简介
            summary_node = soup.find('p',class_="intro")
            res_data['summary'] = summary_node.get_text()
            #获取getURL,获取预加载数据
            score_url=self._get_score_url(page_url)
            res_data['score']=0
            
            if score_url is not None:
                        score_cont = requests.get(score_url,timeout=0.5)
                        try:
                           score=re.search('rate":(.*?),', score_cont.text, re.S).group(1)
                        except:
                            score=0   
            
            #以下使用Xpath
            res_data['score']=score
            #获取字数信息
            html_cont = requests.get(page_url,timeout=0.5)
            selector = etree.HTML(html_cont.text)
            word_count = selector.xpath('/html/body/div[2]/div[6]/div[1]/div[2]/p[3]/em[1]/text()')
            res_data['word_count']=word_count[0]
            #获取"万总点击",将值赋给res_data['word_click_num']
            word_click_back1= selector.xpath('/html/body/div[2]/div[6]/div[1]/div[2]/p[3]/cite[2]/text()')
            word_click_num1= selector.xpath('/html/body/div[2]/div[6]/div[1]/div[2]/p[3]/em[2]/text()')
            if word_click_back1[0]==word_click_back:
                res_data['word_click_num']=word_click_num1[0]
            else:
                res_data['word_click_num']=None    
                
             #获取小说类别
            book_category = selector.xpath('/html/body/div[2]/div[6]/div[1]/div[2]/p[1]/a[1]/text()')
            res_data['book_category']=book_category[0]
           
            return res_data

    4.成果展示,爬取10个符合条件的小说,条件可以自己设置,主要从字数,点击,评分来判定,

    这里设置字数10W以上,分数9以上,总点击50W以上


    控制台可以看到,这里爬取了超过238个页面才找到10本符合条件的小说

    继续看成果



    5.遇到的问题

    (1)python中爬取的数据返回值类型是_ElementStringResult,和int String难匹配,只能强制转换

    如:float() str()

    (2)异步加载和简单反爬虫

    有些网页是ajax异步加载,你要post一些数据之后,他才能返回你想要的一些数据,具体可以通过chrome的

    Network来查看提交了什么数据



    然后构造一个字典,通过requests.post提交上去,就可以得到想要的返回资源。

    同理有些反爬虫要提交HTTP报头也是如此

    (3)预加载

    这个问题从一开始就存在,困扰了我好几天,爬虫也被迫中断,主要的表现是

    爬取分数score 浏览器可以返回正常数据,但是我爬取到的数据一直是0!?

    之后我在问题(2)中得到启发,发现它每次刷新都会发出一个根据uuid发出的

    GET请求,然后数据才从那个response返回


    http://book.qidian.com/ajax/comment/index?_csrfToken=hRMAi3nDUU6l7ZJo3hOcTeqXlFOcgJI8ZzGepfcq&bookId=1004608738&pageSize=15

    然后response里面包含我想要的分数数据,如下:




    之后我就每个URL都构造一个这样的请求来获取分数数据,如下

     url="http://book.qidian.com/ajax/comment/index?_csrfToken=hRMAi3nDUU6l7ZJo3hOcTeqXlFOcgJI8ZzGepfcq&bookId="
                id=re.search('info/(\d+)', page_url, re.S).group(1)
                url=url+id

    好,问题解决

    四.爬虫进阶展望

    (1)速度,这次爬取10本小说,总共爬取238+页面,耗时2分钟,实在难以想象爬取大量页面的耗时,

    可以用多线程Pool加以改进,虽然python的多线程不是真正的多线程,但是也会大大提高速度。

    (2)反爬虫

    主要是代理,IP什么的,不过我想一般的网站也不会考虑这么多吧,程序员本身够辛苦了,再考虑这些,真是累死猿了,想想自己也朝着这方面走。。。。

    (3)账号密码提交,验证码

    这个是以后主要方向,验证码最好爬取出来人工处理

    本人小菜,欢迎指正交流,账号名即qq,有错别字下次再改,先将就着看

    github源码:

    https://github.com/bo07997/algorithm-


    展开全文
  • 知乎众多编程大神推荐的Python书籍,适用于初级学习者和进阶,及高级编程人员的 编程书。
  • python 爬取知乎完整版

    2019-10-07 00:27:05
    由于在爬取知乎是在伯乐在线之后的,需要参考前面的代码,有相同的部分就没有再加入。 在zhihu.py 中 import scrapy import re ...from urllib import parse ...from selenium import webdriver ...

    由于在爬取知乎是在伯乐在线之后的,需要参考前面的代码,有相同的部分就没有再加入。

    在zhihu.py 中

    import scrapy
    import re
    from urllib import parse
    from selenium import webdriver
    from scrapy.http import Request
    from scrapy.loader import ItemLoader
    import time
    import pickle
    import datetime
    import json
    from ArticleSpider.items import ZhihuQuestionItem, ZhihuAnswerItem
    try:
        import urlparse as parse
    except:
        from urllib import parse
    class ZhihuSpider(scrapy.Spider):
        name = 'zhihu'
        allowed_domains = ['www.zhihu.com']
        start_urls = ['https://www.zhihu.com/']
    
        #question的第一页answer的请求url
        start_answer_url = "https://www.zhihu.com/api/v4/questions/{0}/answers?sort_by=default&include=data%5B%2A%5D.is_normal%2Cis_sticky%2Ccollapsed_by%2Csuggest_edit%2Ccomment_count%2Ccollapsed_counts%2Creviewing_comments_count%2Ccan_comment%2Ccontent%2Ceditable_content%2Cvoteup_count%2Creshipment_settings%2Ccomment_permission%2Cmark_infos%2Ccreated_time%2Cupdated_time%2Crelationship.is_author%2Cvoting%2Cis_thanked%2Cis_nothelp%2Cupvoted_followees%3Bdata%5B%2A%5D.author.is_blocking%2Cis_blocked%2Cis_followed%2Cvoteup_count%2Cmessage_thread_token%2Cbadge%5B%3F%28type%3Dbest_answerer%29%5D.topics&limit={1}&offset={2}"
        # start_answer_url ="https://www.zhihu.com/api/v4/questions/{0}/answers?sort_by=default&include=data%5B%2A%5D.is_normal%2Cadmin_closed_comment%2Creward_info%2Cis_collapsed%2Cannotation_action%2Cannotation_detail%2Ccollapse_reason%2Cis_sticky%2Ccollapsed_by%2Csuggest_edit%2Ccomment_count%2Ccan_comment%2Ccontent%2Ceditable_content%2Cvoteup_count%2Creshipment_settings%2Ccomment_permission%2Ccreated_time%2Cupdated_time%2Creview_info%2Crelevant_info%2Cquestion%2Cexcerpt%2Crelationship.is_authorized%2Cis_author%2Cvoting%2Cis_thanked%2Cis_nothelp%2Cupvoted_followees%3Bdata%5B%2A%5D.mark_infos%5B%2A%5D.url%3Bdata%5B%2A%5D.author.follower_count%2Cbadge%5B%3F%28type%3Dbest_answerer%29%5D.topics&limit=3&offset=3"
        # start_answer_url="https://www.zhihu.com/api/v4/questions/22044254/answers?sort_by=default&include=data%5B%2A%5D.is_normal%2Cadmin_closed_comment%2Creward_info%2Cis_collapsed%2Cannotation_action%2Cannotation_detail%2Ccollapse_reason%2Cis_sticky%2Ccollapsed_by%2Csuggest_edit%2Ccomment_count%2Ccan_comment%2Ccontent%2Ceditable_content%2Cvoteup_count%2Creshipment_settings%2Ccomment_permission%2Ccreated_time%2Cupdated_time%2Creview_info%2Crelevant_info%2Cquestion%2Cexcerpt%2Crelationship.is_authorized%2Cis_author%2Cvoting%2Cis_thanked%2Cis_nothelp%2Cupvoted_followees%3Bdata%5B%2A%5D.mark_infos%5B%2A%5D.url%3Bdata%5B%2A%5D.author.follower_count%2Cbadge%5B%3F%28type%3Dbest_answerer%29%5D.topics&limit=3&offset=3"
        headers = {
            "HOST": "www.zhihu.com",
            "Referer": 'https://www.zhihu.com',
    
            'User-Agent':"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.162 Safari/537.36"
        }
    
        custom_settings = {
            "COOKIES_ENABLED": True
        }
    
        def parse(self, response):
             """
                提取出html页面中的所有url 并跟踪这些url进行一步爬取
                如果提取的url中格式为 /question/xxx 就下载之后直接进入解析函数
                """
             all_urls = response.css("a::attr(href)").extract()
             all_urls = [parse.urljoin(response.url, url) for url in all_urls]
             #使用lambda函数对于每一个url进行过滤,如果是true放回列表,返回false去除。
             all_urls = filter(lambda x:True if x.startswith("https") else False, all_urls)
             for url in all_urls:
                 match_obj = re.match("(.*zhihu.com/question/(\d+))(/|$).*", url)
                 if match_obj:
                    # 如果提取到question相关的页面则下载后交由提取函数进行提取
                    request_url = match_obj.group(1)
                    yield scrapy.Request(request_url, headers=self.headers, callback=self.parse_question)
                 else:
                    # 如果不是question页面则直接进一步跟踪
                    yield scrapy.Request(url, headers=self.headers, callback=self.parse)
        def parse_question(self, response):
            #处理question页面, 从页面中提取出具体的question item
            # if "QuestionHeader-title" in response.text:
            #     #处理新版本
            #     match_obj = re.match("(.*zhihu.com/question/(\d+))(/|$).*", response.url)
            #     if match_obj:
            #         question_id = int(match_obj.group(2))
            #
            #     item_loader = ItemLoader(item=ZhihuQuestionItem(), response=response)
            #     item_loader.add_css("title", "h1.QuestionHeader-title::text")
            #     item_loader.add_css("content", ".QuestionHeader-detail span::text")
            #     item_loader.add_value("url", response.url)
            #     item_loader.add_value("zhihu_id", question_id)
            #     item_loader.add_css("answer_num", ".Question-mainColumn a::text")
            #     item_loader.add_css("comments_num", ".QuestionHeader-Comment span::text")
            #     item_loader.add_css("watch_user_num", ".QuestionFollowStatus-counts strong::text")
            #     item_loader.add_css("topics", ".QuestionHeader-topics .Popover div::text")
            #
            #     question_item = item_loader.load_item()
            # else:
                #处理老版本页面的item提取
            match_obj = re.match("(.*zhihu.com/question/(\d+))(/|$).*", response.url)
            if match_obj:
                question_id = int(match_obj.group(2))
    
            item_loader = ItemLoader(item=ZhihuQuestionItem(), response=response)
                # item_loader.add_css("title", ".zh-question-title h2 a::text")
                # item_loader.add_xpath("title", "//*[@id='zh-question-title']/h2/a/text()|//*[@id='zh-question-title']/h2/span/text()")
                # item_loader.add_css("content", "#zh-question-detail")
                # item_loader.add_value("url", response.url)
                # item_loader.add_value("zhihu_id", question_id)
                # item_loader.add_css("answer_num", "#zh-question-answer-num::text")
                # item_loader.add_css("comments_num", "#zh-question-meta-wrap a[name='addcomment']::text")
                # # item_loader.add_css("watch_user_num", "#zh-question-side-header-wrap::text")
                # item_loader.add_xpath("watch_user_num", "//*[@id='zh-question-side-header-wrap']/text()|//*[@class='zh-question-followers-sidebar']/div/a/strong/text()")
                # item_loader.add_css("topics", ".zm-tag-editor-labels a::text")
            item_loader.add_css("title", ".QuestionHeader-title::text")
            item_loader.add_css("content", ".QuestionHeader-detail span::text")
            item_loader.add_value("url", response.url)
            item_loader.add_value("zhihu_id", question_id)
            item_loader.add_css("answer_num", ".List-headerText span::text")
            item_loader.add_css("comments_num", ".QuestionHeader-Comment span::text")
            item_loader.add_css("watch_user_num", ".QuestionFollowStatus-counts strong::text")
            item_loader.add_css("topics", ".QuestionHeader-topics .Popover div::text")
            question_item = item_loader.load_item()
    
            yield scrapy.Request(self.start_answer_url.format(question_id, 20, 0), headers=self.headers, callback=self.parse_answer)
            yield question_item
        def parse_answer(self, reponse):
            #处理question的answer
            ans_json = json.loads(reponse.text)
            is_end = ans_json["paging"]["is_end"]
            next_url = ans_json["paging"]["next"]
    
            #提取answer的具体字段
            for answer in ans_json["data"]:
                answer_item = ZhihuAnswerItem()
                answer_item["zhihu_id"] = answer["id"]
                answer_item["url"] = answer["url"]
                answer_item["question_id"] = answer["question"]["id"]
                answer_item["author_id"] = answer["author"]["id"] if "id" in answer["author"] else None
                answer_item["content"] = answer["content"] if "content" in answer else None
                answer_item["parise_num"] = answer["voteup_count"]
                answer_item["comments_num"] = answer["comment_count"]
                answer_item["create_time"] = answer["created_time"]
                answer_item["update_time"] = answer["question"]["updated_time"]
                answer_item["crawl_time"] = datetime.datetime.now()
    
                yield answer_item
    
            if not is_end:
                yield scrapy.Request(next_url, headers=self.headers, callback=self.parse_answer)
    
        def start_requests(self):
    
    
            browser = webdriver.Chrome(executable_path="D:/Temp/chromedriver.exe")
    
            # browser.get("https://www.zhihu.com/signup?next=%2F")
            browser.get("https://www.zhihu.com/signin")
            browser.find_element_by_css_selector(".SignFlow-accountInput.Input-wrapper input").send_keys("account")#输入正确的账户
            browser.find_element_by_css_selector(".SignFlow-password input").send_keys("password")#输入正确的密码
            print(browser.page_source)
            browser.find_element_by_css_selector(".Button.SignFlow-submitButton").click()
            time.sleep(10)
            Cookies=browser.get_cookies()
            # print(Cookies)
            cookie_dict={}
            for cookie in Cookies:
                f=open('C:/Users/Dell/scrapytest/Scripts/ArticleSpider'+cookie['name']+'.zhihu','wb')
                pickle.dump(cookie,f)
                f.close()
                cookie_dict[cookie['name']]=cookie['value']
            browser.close()
            return[scrapy.Request(url=self.start_urls[0], headers=self.headers,dont_filter=True,cookies=cookie_dict)]
    

     在main.py

    from scrapy.cmdline import execute
    
    import sys
    import os
    
    sys.path.append(os.path.dirname(os.path.abspath(__file__)))
    # execute(["scrapy", "crawl", "jobbole"])
    execute(["scrapy", "crawl", "zhihu"])  

    在items中

    import re
    from scrapy.loader import ItemLoader
    from scrapy.loader.processors import MapCompose, TakeFirst, Join
    from ArticleSpider.settings import SQL_DATETIME_FORMAT, SQL_DATE_FORMAT
    from ArticleSpider.utils.common import extract_num
    from w3lib.html import remove_tags
    
    class ArticlespiderItem(scrapy.Item):
        # define the fields for your item here like:
        # name = scrapy.Field()
        pass
    def date_convert(value):
        try:
            create_date = datetime.datetime.strptime(value, "%Y/%m/%d").date()
        except Exception as e:
            create_date = datetime.datetime.now().date()
    
        return create_date
    
    
    def get_nums(value):
        match_re = re.match(".*?(\d+).*", value)
        if match_re:
            nums = int(match_re.group(1))
        else:
            nums = 0
    
        return nums
    
    
    def remove_comment_tags(value):
        #去掉tag中提取的评论
        if "评论" in value:
            return ""
        else:
            return value
    
    def return_value(value):
        return value
    def exclude_none(value):
        if value:
            return value
        else:
            value = "无"
            return value
    

      





    class ZhihuQuestionItem(scrapy.Item): #知乎的问题 item zhihu_id = scrapy.Field() topics = scrapy.Field() url = scrapy.Field() title = scrapy.Field() content = scrapy.Field( input_processor=MapCompose(exclude_none), ) answer_num = scrapy.Field() comments_num = scrapy.Field() watch_user_num = scrapy.Field() click_num = scrapy.Field() crawl_time = scrapy.Field() def get_insert_sql(self): #插入知乎question表的sql语句 insert_sql = """ insert into zhihu_question(zhihu_id, topics, url, title, content, answer_num, comments_num, watch_user_num, click_num, crawl_time ) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s) ON DUPLICATE KEY UPDATE content=VALUES(content), answer_num=VALUES(answer_num), comments_num=VALUES(comments_num), watch_user_num=VALUES(watch_user_num), click_num=VALUES(click_num) """ zhihu_id = self["zhihu_id"][0] topics = ",".join(self["topics"]) url = self["url"][0] title = "".join(self["title"]) # content = "".join(self["content"]) # answer_num = extract_num("".join(self["answer_num"])) # # comments_num = extract_num("".join(self["comments_num"])) try: content = "".join(self["content"]) except BaseException: content = "无" try: answer_num = extract_num("".join(self["answer_num"])) except BaseException: answer_num = 0 comments_num = extract_num("".join(self["comments_num"])) if len(self["watch_user_num"]) == 2: watch_user_num = int(self["watch_user_num"][0]) click_num = int(self["watch_user_num"][1]) else: watch_user_num = int(self["watch_user_num"][0]) click_num = 0 crawl_time = datetime.datetime.now().strftime(SQL_DATETIME_FORMAT) params = (zhihu_id, topics, url, title, content, answer_num, comments_num, watch_user_num, click_num, crawl_time) return insert_sql, params class ZhihuAnswerItem(scrapy.Item): #知乎的问题回答item zhihu_id = scrapy.Field() url = scrapy.Field() question_id = scrapy.Field() author_id = scrapy.Field() content = scrapy.Field() parise_num = scrapy.Field() comments_num = scrapy.Field() create_time = scrapy.Field() update_time = scrapy.Field() crawl_time = scrapy.Field() def get_insert_sql(self): #插入知乎回答表的sql语句 insert_sql = """ insert into zhihu_answer(zhihu_id, url, question_id, author_id, content, parise_num, comments_num, create_time, update_time, crawl_time ) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s) ON DUPLICATE KEY UPDATE content=VALUES(content), comments_num=VALUES(comments_num), parise_num=VALUES(parise_num), update_time=VALUES(update_time) """ create_time = datetime.datetime.fromtimestamp(self["create_time"]).strftime(SQL_DATETIME_FORMAT) update_time = datetime.datetime.fromtimestamp(self["update_time"]).strftime(SQL_DATETIME_FORMAT) params = ( self["zhihu_id"], self["url"], self["question_id"], self["author_id"], self["content"], self["parise_num"], self["comments_num"], create_time, update_time, self["crawl_time"].strftime(SQL_DATETIME_FORMAT), ) return insert_sql, params

    在setting中

    import os
    BOT_NAME = 'ArticleSpider'
    
    SPIDER_MODULES = ['ArticleSpider.spiders']
    NEWSPIDER_MODULE = 'ArticleSpider.spiders'
    
    
    # Crawl responsibly by identifying yourself (and your website) on the user-agent
    #USER_AGENT = 'ArticleSpider (+http://www.yourdomain.com)'
    
    # Obey robots.txt rules
    ROBOTSTXT_OBEY = False
    
    # Configure maximum concurrent requests performed by Scrapy (default: 16)
    #CONCURRENT_REQUESTS = 32
    
    # Configure a delay for requests for the same website (default: 0)
    # See https://doc.scrapy.org/en/latest/topics/settings.html#download-delay
    # See also autothrottle settings and docs
    #DOWNLOAD_DELAY = 3
    # The download delay setting will honor only one of:
    #CONCURRENT_REQUESTS_PER_DOMAIN = 16
    #CONCURRENT_REQUESTS_PER_IP = 16
    
    # Disable cookies (enabled by default)
    COOKIES_ENABLED = True
    
    # Disable Telnet Console (enabled by default)
    #TELNETCONSOLE_ENABLED = False
    
    # Override the default request headers:
    #DEFAULT_REQUEST_HEADERS = {
    #   'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    #   'Accept-Language': 'en',
    #}
    
    # Enable or disable spider middlewares
    # See https://doc.scrapy.org/en/latest/topics/spider-middleware.html
    #SPIDER_MIDDLEWARES = {
    #    'ArticleSpider.middlewares.ArticlespiderSpiderMiddleware': 543,
    #}
    
    # Enable or disable downloader middlewares
    # See https://doc.scrapy.org/en/latest/topics/downloader-middleware.html
    #DOWNLOADER_MIDDLEWARES = {
    #    'ArticleSpider.middlewares.ArticlespiderDownloaderMiddleware': 543,
    #}
    
    # Enable or disable extensions
    # See https://doc.scrapy.org/en/latest/topics/extensions.html
    #EXTENSIONS = {
    #    'scrapy.extensions.telnet.TelnetConsole': None,
    #}
    
    # Configure item pipelines
    # See https://doc.scrapy.org/en/latest/topics/item-pipeline.html
    ITEM_PIPELINES = {
       'ArticleSpider.pipelines.ArticlespiderPipeline': 300,
        # 'scrapy.pipelines.images.ImagesPipeline': 1,
        # 'ArticleSpider.pipelines.ArticleImagePipeline':1,
        'ArticleSpider.pipelines.JsonExporterPipeline':2,
        # 'ArticleSpider.pipelines.MysqlPipeline': 4,
        'ArticleSpider.pipelines.MysqlTwistedPipline': 1,
    }
    IMAGES_URLS_FIELD = "front_image_url"
    project_dir = os.path.abspath(os.path.dirname(__file__))
    IMAGES_STORE = os.path.join(project_dir, 'images')
    import sys
    BASE_DIR = os.path.dirname(os.path.abspath(os.path.dirname(__file__)))
    sys.path.insert(0, os.path.join(BASE_DIR, 'ArticleSpider'))
    
    USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.162 Safari/537.36"
    
    # Enable and configure the AutoThrottle extension (disabled by default)
    # See https://doc.scrapy.org/en/latest/topics/autothrottle.html
    AUTOTHROTTLE_ENABLED = True
    # The initial download delay
    #AUTOTHROTTLE_START_DELAY = 5
    # The maximum download delay to be set in case of high latencies
    #AUTOTHROTTLE_MAX_DELAY = 60
    # The average number of requests Scrapy should be sending in parallel to
    # each remote server
    #AUTOTHROTTLE_TARGET_CONCURRENCY = 1.0
    # Enable showing throttling stats for every response received:
    #AUTOTHROTTLE_DEBUG = False
    
    # Enable and configure HTTP caching (disabled by default)
    # See https://doc.scrapy.org/en/latest/topics/downloader-middleware.html#httpcache-middleware-settings
    #HTTPCACHE_ENABLED = True
    #HTTPCACHE_EXPIRATION_SECS = 0
    #HTTPCACHE_DIR = 'httpcache'
    #HTTPCACHE_IGNORE_HTTP_CODES = []
    #HTTPCACHE_STORAGE = 'scrapy.extensions.httpcache.FilesystemCacheStorage'
    MYSQL_HOST = "localhost"
    MYSQL_DBNAME = "article_spider"
    MYSQL_USER = "root"
    MYSQL_PASSWORD = "123456"
    
    SQL_DATETIME_FORMAT = "%Y-%m-%d %H:%M:%S"
    SQL_DATE_FORMAT = "%Y-%m-%d"
    

      

     

     

     

     

     

     

     

     

     

     

     

     

     

    转载于:https://www.cnblogs.com/lin1318/p/8854884.html

    展开全文
  • 2019独角兽企业重金招聘Python工程师标准>>> ...

    应该是动词advise和动词suggest的区别

    相同点:两个动词都有“建议”之意,并且二者都可接+that –clause

    We wish to advise you that you now owe the bank $500.你现欠银行五百美元,特此通知。

    suggested that it would be quicker to travel by train. 我建议说坐火车旅行要快一些。

    不同点:

    1  advise sb. to do sth.

    2  suggest doing sth.

    He advised farmers to choose the best-heads. 他劝告农民要挑选最好的谷穗。

    He suggested changing the plan.他建议改变这个计划。

    具体用法:

    suggest表示建议”“提议以下用法。
    (1)suggest后接名词活动名词。例如:
    They suggested a new plan to the principal.他们向校长提出了新的计划。
    He suggested going to Paris.她建议乘飞机去巴黎。
    I suggested not telling lies to Alice.我建议不要向埃丽斯撒谎。


    2suggest后接that 从句,从句中谓语动词用虚拟语气,即should+动词原形,也可以直接使用动词原形。例如:
    Tom suggested that we (should) come the next Friday.汤姆建议我们下星期五来。
    I suggested Jane visit the chemistry lab right away.我建议简立即去看看化学实验室。
    I suggested Jack (should) not wear the sweater.我建议杰克不要穿那件毛绒衫。


    2suggest表示暗示,表明,使人联想到时,后面可以接名词或从句,从句的谓语动词不要用虚拟语气,例如:
    I suggested that he was not suitable for the job.我暗示他说他不适合这项工作。

    The dark clouds suggest rain.乌云预示着下雨。
    What does the word "black" suggest to you ?""这个词使你联想到什么?
    有时在
    suggest后面的宾语从句中,谓语动词也有用其他形式的。例如:
    I suggest that you don”t ask him for the vacation.我建议你不要让他回来度假。


    3advise 后接名词、动名词、不定式的复合结构和从句等,advise后接从句时,从句的谓语动词用虚拟语气,即should+动词原形,should可以省略。
    例如:
    The doctor advised more exercise.医生建议多运动。
    Tom advised watching the film the next week.汤姆建议下周去看电影。
    Mother advised me to put more clothes.妈妈劝我多穿点衣服。
    The doctor advised that he(should)be operated on at once.医生建议他立即做手术

    转载于:https://my.oschina.net/u/138995/blog/201698

    展开全文
  • Python3 * 和 ** 运算符

    2018-06-05 11:07:40
    Python 中,* 和 ** 具有语法多义性,具体来说是有三类用法。1. 算数运算* 代表乘法** 代表乘方&gt;&gt;&gt; 2 * 5 10 &gt;&gt;&gt; 2 ** 5 322. 函数参数*args 和 **kwargs 主要用于...
  • python语言介绍

    2018-11-15 21:11:02
    Python是一种动态的、面向对象的脚本语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越来越多被用于独立的、大型项目的开发。 发展历程  自从20世纪90年代初Python语言诞生...
  • 本课程讲解使用Python进行音频处理和视频处理,全程讲案例。预计20课,一边录制课程一边补充目录。课程录完之前暂定39元,全部上传之后再重新定价。
  • Python中的*使用

    2018-03-04 19:05:05
    Python中的*使用  在为函数传递参数和函数定义时使用参数的时候,时常会看到有和 *和**,下面分别讲解其作用。 调用函数时使用*和 ** 假设有函数 def test(a, b, c) test(*args):* 的作用其实就是把序列 args...
  • python安装教程

    2018-06-07 15:44:54
    Python安装教程一、博主自言随着人工智能的快速发展,python语言越来越受大家的欢迎,博主前段时间先自学了一次,这次再次巩固,顺便分享给大家我遇到的坑。帮助大家学习的时候少走弯路。希望会对大家有所帮助,欢迎...
  • 最新Python学习路线+千锋Python课程大纲+Python视频教程+Python学习资料下载地址大合集 目前Python已经成为最受欢迎的程序设计语言之一。Python的设计哲学是“优雅”、“明确”、“简单”。 Python的优点(来自...
  • Python全栈视频教程

    2019-10-30 14:39:55
    Python全栈视频培训教程,帮助开发者从零到一入门python:1.深入理解python语法机制与底层原理,2.深入实战python各种案例 , 3.语音识别,图形界面,多线程爬虫,语音合成,游戏控制等等精彩案例。
  • Python爬虫技术视频教程,该课程每堂课都有一个作业,包含的项目案例有家长帮142600条数据爬取与分析,全球天气数据抓取与分析,淘宝商品信息数据众数分析,12306余票查询,python软件打包exe与发布。学完此课程能让...
  • 之前编写Python更多的是使用pycharm作为编译器进行开发,但是个人感觉用起来比较笨重,而且还收费的,需要进行破解才能使用。后来发现vscode这个软件,觉得很轻便,而且和之前使用的vs2018风格一样。 在这里对...
  • 问题如题描述,python 运行过程中直接导致python 解释器崩溃(不是异常,直接崩溃),下面简叙一下debug过程: google查询结果显示这种情况多数是因为Python里的C扩展导致(访问了非法内存区域,可能和C自身内存管理...
  • 本课程提供零基础的孩子学习编程,学习Python语言的基本知识,讲课内容通俗易懂,结合大量的实例,让孩子更容易理解编程中的一些概念。 学会本课程后,孩子能看懂一般的Python代码,并能写简单的程序,学会编程...
1 2 3 4 5 ... 20
收藏数 3,138,270
精华内容 1,255,308
关键字:

python