精华内容
下载资源
问答
  • 最近在学python 和C语言,听说python可以写爬虫,还可以做运维,还可以做大数据,C语言是基础,也的学 哎呦我去 那叫一个类啊 本来是做java的 但是还是要学python和C语言 想当年大学C语言考试那怎能用不及格...
  • 2.函数:In Python Everything is A Function,在Python中,所有的一切都是函数,典型的C语言写法,把所需的功能呢都写成一个一个函数,然后由函数调用函数 3.现在编写一个简单的程序makePasswordFileFunction.py...

    1.所有的程序都是由函数和类组成的,可以说任何程序里面包含的不是函数就是类

    2.函数:In Python Everything is A Function,在Python中,所有的一切都是函数,典型的C语言写法,把所需的功能呢都写成一个一个函数,然后由函数调用函数

     

    3.现在编写一个简单的程序makePasswordFileFunction.py,创建一个有针对性的专用密码字典:

     

    # !usr/bin/env python
    # -*- coding:utf-8 -*-


    import os
    import platform
    import itertools
    import time

    def main():
    """主程序"""
    global rawList #原始数据列表
    rawList=[]
    global denyList #非法单词列表
    denyList=[' ','','@']
    global pwList #最终的密码列表
    pwList=[]
    global minLen #密码的最小长度
    minLen=6
    global maxLen #密码的最大长度
    maxLen=16
    global timeout
    timeout=3
    global flag
    flag=0
    run={
    '0':exit, #退出程序
    '1':getRawList, #创建原始列表
    '2':addDenyList, #添加不可能出现的元素
    '3':clearRawList, #清空列表
    '4':setRawList, #原始列表排序
    '5':modifyPasswordLen, #修改最终的密码长度
    '6':createPasswordList, #创建最终的字典列表
    '7':showPassword, #显示密码
    '8':createPasswordFile, #创建密码文件
    }

    while True:
    mainMenu()
    op=raw_input('输入选项:')
    if op in map(str,range(len(run))):
    run.get(op)()
    else:
    tipMainMenuInputError()
    continue

    def mainMenu():
    """主菜单"""
    global denyList
    global rawList
    global pwList
    global flag
    clear()

    print(u'| |')
    print(u'='*40)
    print(u"| |")
    print(u"|| 0:退出程序")
    print(u"|| 1:输入密码原始字符串")
    print(u"|| 2:添加非法字符到列表")
    print(u"|| 3:清空原始密码列表")
    print(u"|| 4:整理原始密码列表")
    print(u"|| 5:改变默认密码长度(%d-%d)" %(minLen,maxLen))
    print(u"|| 6:创建密码列表")
    print(u"|| 7:显示所有密码")
    print(u"|| 8:创建密码文件")
    print(u"||")
    print(u'='*40)
    print(u"||")
    print(u"当前非法字符为:%s" %denyList)
    print(u"当前原始密码元素为:%s" %rawList)
    print(u"共有密码%d个" %len(pwList))
    if flag:
    print(u"已在当前目录创建密码文件dic.txt")
    else:
    print(u"尚未创建密码文件")

    def clear():
    """清屏函数"""
    OS=platform.system()
    if (OS==u"Windows"):
    os.system('cls')
    else:
    os.system('clear')

    def tipMainMenuInputError():
    """错误提示"""
    clear()
    print(u"只能输入0-7的整数,等待%d秒后重新输入" %timeout)
    time.sleep(timeout)


    def getRawList():
    """获取原始数据列表"""
    clear()
    global denyList
    global rawList
    print(u"输入回车后直接退出")
    print(u"当前原始密码列表为:%s" %rawList)
    st=None
    while not st== '':
    st=raw_input("请输入密码元素字符串")
    if st in denyList:
    print(u"这个字符串是预先设定的非法字符串")
    continue
    else:
    rawList.append(st)
    clear()
    print(u"输入回车后直接退出")
    print(u"当前原始密码列表为:%s" %rawList)

    def addDenyList():
    """添加非法词"""
    clear()
    global denyList
    print(u"输入回车后直接退出")
    print(u"当前非法字符为:%s" %denyList)
    st=None

    while not st=='':
    st=raw_input("请输入需要添加的非法字符串:")
    denyList.append(st)
    clear()
    print(u"输入回车后直接退出")
    print(u"当前非法字符串列表为:%s" %denyList)

    def clearRawList():
    """清空原始数据列表"""
    global rawList
    rawList=[]

    def setRawList():
    """整理原始数据列表"""
    global rawList
    global denyList
    a=set(rawList)
    b=set(denyList)
    rawList=[]
    for str in set(a-b):
    rawList.append(str)

    def modifyPasswordLen():
    """修改默认密码的长度"""
    clear()
    global maxLen
    global minLen
    while True:
    print(u"当前密码长度为%d-%d" %(minLen,maxLen))
    min=raw_input("请输入密码最小长度:")
    max=raw_input("请输入密码最大长度:")
    try:
    minLen=int(min)
    maxLen=int(max)
    except ValueError:
    print(u"密码长度只能输入数字[6-18]")
    break
    if minLen not in xrange(6,19) or maxLen not in xrange(6,19):
    print(u"密码长度只能输入数字[6-18]")
    minLen=6
    maxLen=16
    continue
    if minLen==maxLen:
    res=raw_input("确定将密码长度设定为%d吗?(Yy/Nn)" %minLen)
    if res not in list('yYnN'):
    print(u"输入错误,请重新输入")
    continue
    elif res in list('Yy'):
    print(u"好吧,你确定就好")
    break
    else:
    print(u"给个机会,改一下把")
    continue
    elif minLen>maxLen:
    print(u"最小长度比最大长度还大,可能吗?请重新输入")
    minLen=6
    maxLen=16
    continue
    else:
    print(u"设置完毕,等待%d秒后返回主菜单" %timeout)
    time.sleep(timeout)
    break

    def createPasswordList():
    """创建密码列表"""
    global rawList
    global pwList
    global maxLen
    global minLen
    titleList=[]
    swapcaseList=[]
    for st in rawList:
    swapcaseList.append(st.swapcase())
    titleList.append(st.title())

    sub1=[]
    sub2=[]
    for st in set(rawList+titleList+swapcaseList):
    sub1.append(st)
    for i in xrange(2,len(sub1)+1):
    sub2+=list(itertools.permutations(sub1,i))
    for tup in sub2:
    PW=''
    for subPW in tup:
    PW+=subPW

    if len(PW) in xrange(minLen,maxLen+1):
    pwList.append(PW)
    else:
    pass

    def showPassword():
    """显示创建的密码"""
    global pwList
    global timeout
    for i in xrange(len(pwList)):
    if i%4 ==0:
    print("%s\n" %pwList[i])
    else:
    print("%s\t" %pwList[i])

    print('\n')
    print(u"显示%d秒,回到主菜单" %timeout)
    time.sleep(timeout)

    def createPasswordFile():
    """创建密码字典文件"""
    global flag
    global pwList
    print(u"当前目录下创建字典文件:dic.txt")
    time.sleep(timeout)
    with open('./dic.txt','w+') as fp:
    for PW in pwList:
    fp.write(PW)
    fp.write('\n')
    flag=1

    if __name__ == '__main__':
    main()


    重点讲解几个用到的函数:
    1.map()函数:
    map()是 Python 内置的高阶函数,它接收一个函数 f 和一个 list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回。
    
    例如,对于list [1, 2, 3, 4, 5, 6, 7, 8, 9]
    
    如果希望把list的每个元素都作平方,就可以用map()函数:
    
    
    
    因此,我们只需要传入函数f(x)=x*x,就可以利用map()函数完成这个计算:
    
    def f(x):
        return x*x
    print map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])
    输出结果:
    
    [1, 4, 9, 10, 25, 36, 49, 64, 81]
    注意:map()函数不改变原有的 list,而是返回一个新的 list。
    
    利用map()函数,可以把一个 list 转换为另一个 list,只需要传入转换函数。
    
    由于list包含的元素可以是任何类型,因此,map() 不仅仅可以处理只包含数值的 list,事实上它可以处理包含任意类型的 list,只要传入的函数f可以处理这种数据类型。
    

     

    2.platform.system()函数:
    • platform.system() 获取操作系统类型,windows、linux等
    • platform.platform() 获取操作系统,Darwin-9.8.0-i386-32bit
    • platform.version() 获取系统版本信息 6.2.0
    • platform.mac_ver()
    • platform.win32_ver() ('post2008Server', '6.2.9200', '', u'Multiprocessor Free')

    3.os.system('cls')函数: 在 python命令行中使用下面命令,可以清除命令行。

    4.itertools.permutations()函数:itertools模块,使得排列组合的实现非常简单

    有序排列:e.g., 4个数内选2个排列:

    >>> print list(itertools.permutations([1,2,3,4],2))
    [(1, 2), (1, 3), (1, 4), (2, 1), (2, 3), (2, 4), (3, 1), (3, 2), (3, 4), (4, 1), (4, 2), (4, 3)]

     

    程序执行结果为:

     

    5.类:In python Everything is  A Class,这种C++的写法就是把所有相似的功能都封装到一个类中,最理想的情况是一个程序只有一个主程序,然后在主程序里实例化类

    编写一个密码字典,makePasswordFileClass.py:

    # !usr/bin/env python
    # -*- coding:utf-8 -*-


    import os
    import platform
    import time
    import itertools

    class MakePassword(object):
    def __init__(self):
    self.rawList=[]
    self.denyList=[' ','','@']
    self.pwList=[]
    self.minLen=6
    self.maxLen=16
    self.timeout=3
    self.flag=0
    self.run={
    '0':exit,
    '1':self.getRawList,
    '2':self.addDenyList,
    '3':self.clearRawList,
    '4':self.setRawList,
    '5':self.modifyPasswordLen,
    '6':self.createPasswordList,
    '7':self.showPassword,
    '8':self.createPasswordFile
    }
    self.main()

    def main(self):
    while True:
    self.mainMenu()
    op=raw_input('输入选项:')
    if op in map(str,range(len(self.run))):
    self.run.get(op)()
    else:
    self.tipMainMenuInputError()
    continue



    def mainMenu(self):
    self.clear()
    print(u'| |')
    print(u'='*40)
    print(u"| |")
    print(u"|| 0:退出程序")
    print(u"|| 1:输入密码原始字符串")
    print(u"|| 2:添加非法字符到列表")
    print(u"|| 3:清空原始密码列表")
    print(u"|| 4:整理原始密码列表")
    print(u"|| 5:改变默认密码长度(%d-%d)" %(self.minLen,self.maxLen))
    print(u"|| 6:创建密码列表")
    print(u"|| 7:显示所有密码")
    print(u"|| 8:创建密码文件")
    print(u"||")
    print(u'='*40)
    print(u"||")
    print(u"当前非法字符为:%s" %self.denyList)
    print(u"当前原始密码元素为:%s" %self.rawList)
    print(u"共有密码%d个" %len(self.pwList))
    if self.flag:
    print(u"已在当前目录创建密码文件dic.txt")
    else:
    print(u"尚未创建密码文件")

    def clear(self):
    OS=platform.system()
    if (OS ==u'Windows'):
    os.system('cls')
    else:
    os.system('clear')

    def tipMainMenuInputError(self):
    self.clear()
    print(u"只能输入0-7的整数,等待%d秒后重新输入" %self.timeout)
    time.sleep(self.timeout)

    def getRawList(self):
    self.clear()
    print(u"输入回车后直接退出")
    print(u"当前原始密码列表为:%s" %(self.rawList))
    st=None
    while not st=='':
    st=raw_input("请输入密码元素字符串:")
    if st in self.denyList:
    print(u"这个字符串是预先设定的非法字符串")
    continue
    else:
    self.rawList.append(st)
    self.clear()
    print(u"输入回车后直接退出")
    print(u"当前原始密码列表为:%s" %self.rawList)

    def addDenyList(self):
    self.clear()
    print(u"输入回车后直接退出")
    print(u"当前非法字符为:%s" %self.denyList)
    st=None
    while not st=='':
    st=raw_input("请输入需要添加的非法字符串:")
    self.denyList.append(st)
    self.clear()
    print(u"输入回车直接退出")
    print(u"当前非法字符串列表是:%s" %self.denyList)

    def clearRawList(self):
    self.rawList=[]
    def setRawList(self):
    a=set(self.rawList)
    b=set(self.denyList)
    self.rawList=[]
    for str in set(a-b):
    self.rawList.append(str)

    def modifyPasswordLen(self):
    self.clear()
    while True:
    print(u"当前密码长度为%d-%d" %(self.minLen,self.maxLen))
    min=raw_input("请输入密码最小长度:")
    max=raw_input("请输入密码最大长度:")
    try:
    self.minLen=int(min)
    self.maxLen=int(max)

    except ValueError:
    print(u"密码长度只能输入数字[6-18]")
    break
    if self.minLen not in xrange(6,19) or self.maxLen not in xrange(6,19):
    print(u"密码长度只能输入数字[6-18]")
    self.minLen=6
    self.maxLen=16
    continue
    if self.minLen==self.maxLen:
    res=raw_input("确定将密码长度设定为%d吗?(Yy/Nn)" %self.minLen)

    if res not in list('yYNn'):
    print(u"输入错误,请重新输入")
    continue
    elif res in list('Yy'):
    print(u"好吧,你确定就好")
    break
    else:
    print(u"给个机会,改一下吧")
    continue

    elif self.minLen>self.maxLen:
    print(u"最小长度大于最大长度,可能吗?请重新输入")
    self.minLen=6
    self.maxLen=16
    continue
    else:
    print(u"设置完毕,等待%d 秒后返回主菜单" %self.timeout)
    time.sleep(self.timeout)
    break

    def createPasswordList(self):
    titleList=[]
    swapcaseList=[]
    for st in self.rawList:
    swapcaseList.append(st.swapcase())
    titleList.append(st.title())

    sub1=[]
    sub2=[]
    for st in set(self.rawList+titleList+swapcaseList):
    sub1.append(st)
    for i in xrange(2,len(sub1)+1):
    sub2+=list(itertools.permutations(sub1,i))
    for tup in sub2:
    PW=''
    for subPW in tup:
    PW+=subPW

    if len(PW) in xrange(self.minLen,self.maxLen+1):
    self.pwList.append(PW)
    else:
    pass

    def showPassword(self):
    for i in xrange(len(self.pwList)):
    if i%4==0:
    print(u"%s\n" %self.pwList[i])
    else:
    print(u"%s\t" %self.pwList[i])
    print('\n')
    print(u"显示%d秒,回到主菜单" %self.timeout)
    time.sleep(self.timeout)

    def createPasswordFile(self):
    print(u"当前目录下创建字典文件:dic.txt")
    time.sleep(self.timeout)
    with open('./dic.txt','w+') as fp:
    for PW in self.pwList:
    fp.write(PW)
    fp.write('\n')

    self.flag=1


    if __name__ == '__main__':
    mp=MakePassword()



    执行结果完全一样


     

     




    转载于:https://www.cnblogs.com/hqutcy/p/7214604.html

    展开全文
  • 一般来说,编写爬虫的首选自然非python莫属,除此之外,java等语言也是不错的选择。选择上述语言的原因不仅仅在于它们均有非常不错的网络请求库字符串处理库,还在于基于上述语言的爬虫框架非常之多完善。良好的...
  • Jesse Jiryu Davis是纽约MongoDB的一名工程师,他是MongoDB Python 驱动Motor的主要作者,同时他也是MongoDB C语言驱动项目的重要成员。他的个人博客地址。 Guido van Rossum是Python的创建者,Py...

    本文翻译自500L系列文章,原文链接, 原文作者A. Jesse Jiryu Davis 和 Guido van Rossum.

    A. Jesse Jiryu Davis是纽约MongoDB的一名工程师,他是MongoDB Python 驱动Motor的主要作者,同时他也是MongoDB C语言驱动项目的重要成员。他的个人博客地址

    Guido van Rossum是Python的创建者,Python社区称他为BDFL(Benevolent Dictator For Life), 他的个人博客地址

    简介

    传统的计算机和程序设计主要目的是使程序可以更快地运行,然而很多网络程序的设计,更多的时间花费在等待而非计算,因为网络中常用到的是缓慢的连接。在设计这些程序的时候,我们的挑战在于如何有效地处理这些延时,常用的算法是采用异步IO处理。

    这一章节我们主要实现一个简单的网络爬虫。这个网络爬虫采用异步算法,其中只有少量的运算,它可以同时等待多个网络响应,十分高效。爬虫抓取的网页越多,用时越短。它会为每个等待中人连接提供一个进程,因此它有可能在抓取过程中耗尽内存,或者其它的一些资源。

    我们将分三步来阐述这个例子。首先,我们会先看一下异步事件循环,并实现一个带回调的异步事件循环:它很高效,但是如果在它基础上对程序进行扩展就变得十分麻烦;之后,我们会实现一个高效又易于扩展的方案,这个方案主要基于生成器实现;最后,我们会基于异步函数库和异步队列实现一个更为好的方案。

    主要任务

    网络爬虫的主要任务就是实现对网页内容的爬取,也有可能会对其进行排序或压缩。它一般由一个网址作为开始,抓取网页内容并进行分析,从中找到没有爬取的链接,并将这些链接放到一个队列中,当找不到新的链接的时候,爬虫就会停止。

    这个过程中我们可以同时处理多个网页以提高效率,也就是当爬虫抓到一些网页链接的时候,它可以同时通过多个进程和多个Socket抓取网页,不过有时候链接过多时,我们就需要控制同时抓取的数量。

    传统方法

    传统的并行抓取的方法是创建一个线程池,每一个线程池通用一个Socket下载一个网页,比如下载xkcd.com网页可以通用以下代码实现。

    def fetch(url):
        sock = socket.socket()
        sock.connect(('xkcd.com', 80))
        request = 'GET {} HTTP/1.0\r\nHost: xkcd.com\r\n\r\n'.format(url)
        sock.send(request.encode('ascii'))
        reponse = b''
        chunk = sock.rev(4096)
        while chunk:
            reponse += chunk
            chunk = sock.rev(4096)
    
        # page is now downloaded.
        links = parse_links(response)
        q.add(links)

    默认情况下,socket的操作是阻塞的,也就是在程序调用connectrecv的时候,程序会一直等待操作完成,这样,如果我们需要同时下载多个链接的话,我们就需要很多线程。一个更好一点的做法是将这些空闲的线程放到一个线程池,在需要的时候把它们拿出来执行新的任务,这也类似于socket的连接池。

    从目前我们的程序来看线程依然是十分宝贵的资源,在我(作者)的电脑上一个python的线程大致会耗费50k的内存。如果同时开启成千上万的线程的话就会导致系统崩溃,因此这些线程的数量便成为程序的一个瓶颈。

    在Dan Kegel的文章”The C10K Problem”中,作者就阐述了这样的问题,他在文章中写道:

    现在的服务器应该有同时处理上万个客户端的访问了,毕竟互联网的世界很大。

    Kegel在1999年也提到了这个问题,虽然上万的数据量现在听起来并不大,但是科技在进步,相同类型的问题依然存在,只是规模上有些许差异。即使线程消耗的问题可以解决,我们还将面临socket链接用尽的问题。

    异步算法

    异步IO框架可以在一个线程上通过非阻塞Socket连接实现类似的并发操作。在我们的异步爬虫算法里,我们将连接到服务器的连接设置为非阻塞的方式:

    sock = socket.socket()
    sock.setblocking(False)
    try:
        sock.connect(('xkcd.com', 80))
    except BlockingIOError:
        pass

    不过非阻塞的连接在建立的时候会抛出一个异常,这个异常和C语言里将errno设置为EINPROGERSS类似,目的就是通知程序连接已经开始创建。

    现在我们还需要知道连接什么时间创建完成,因为只有连接正常建立我们才能向服务器发送数据,这个查询我们就通过一个简单的循环实现就好。

    request = 'GET {} HTTP/1.0\r\nHost: xkcd.com\r\n\r\n'.format(url)
    encoded = request.encode('ascii')
    
    while True:
        try:
            sock.send(encoded)
            break # Done
        except OSError as e:
            pass
    
    print('Sent')

    不过这种方法虽然简单,却并不适合多线程。实际在BSD Unix中对于这种问题早就有相应的解决方法了,select就是Unix中通过C语言实现的一个专门用于等待类似事件的对象。如今网络应用中这样的需求越来越多,也就有了新的解决方法,比如poll, BSD中的kqueue,linux中的epoll等等。它们的API与select类似,不过更适合管理大规模的连接。

    Python3.4中原生库DefaultSelector会自动选择系统中相应的select类函数。比如使用这个函数库注册相应的非阻塞网络IO代码如下:

    from selectors import DefaultSelector, EVENT_WRITE
    
    selector = DefaultSelector()
    
    sock = socket.socket()
    sock.setblocking(False)
    try:
        sock.connect(('xkcd.com', 80))
    except BlockingIOError:
        pass
    
    def connected():
        selector.unregister(sock.fileno())
        print('connected')
    
    selector.register(sock.fileno(), EVENT_WIRTE, connected)

    在上述代码中,我们忽略了产生的BlockingIOError异常,并且通过selector.register函数将socket文件的ID与我们期望的写事件相绑定。这样一旦socket文件变得可以写,系统就会调用已经注册的回调函数,这里我们注册的回调函数是connected

    之后我们在一个循环中处理收到的通知:

    def loop():
        while True:
            events = selector.select()
            for event_key, event_mask in events:
                callback = event_key.data
                callback()

    connected回调函数存储在event_key.data中,这样我们就可就可以一次执行一个非阻塞socket的数据接收和处理。

    通过这种方式程序就可以集中处理已经接收的数据,而那些尚未完成的事件将一直处于等待状态。

    在上面这片例子中,我们通过一个异步框架实现了一个线程中在并了操作。现在我们虽然实现了并发操作,但并不是真正意义上的并行处理,因为在涉及IO的操作依然没有并行化。现在的问题就在于IO的瓶颈。

    不过相比于之前多线程的操作,我们没有线程上的开销,这是我们还要纠正一个错误理念:异步要比多线程快。实际很多情况下并非如此,比如在python中,当处理少量活跃连接的时候一个事件循环就没有多线程快。如果没有线程锁,实际多线程一般要比异步操作快。异步操作的优势在于处理并不活跃的连接。

    展开全文
  • Python 爬虫例子

    2018-06-05 20:08:13
    小甲鱼的视频都很经典,将的挺有意思,风趣,时不时讲讲荤段子,泡妹纸技巧(滑稽脸),之前看过对应的“C语言入门视频”,“数据结构算法”都讲的很好,想看的直接百度即可 一. Python 调用网易云翻译进行字符...

    学了几天的语法,今天终于开始实战-爬虫,心情有点小激动
    本人看的教程主要是:
    廖雪峰的Python博客 大家看了都说好
    小甲鱼的Python视频教程
    小甲鱼的视频都很经典,将的挺有意思,风趣,时不时讲讲荤段子,泡妹纸技巧(滑稽脸),之前看过对应的“C语言入门视频”,“数据结构和算法”都讲的很好,想看的直接百度即可

    一. Python 调用网易云翻译进行字符串的翻译

    参考博客
    这个例子,在小甲鱼的视频里面也讲到了,有心人可以取去我提供的视频里面找

    # -*- coding:utf-8 -*-
    import  urllib.request
    import  urllib.parse
    import  json
    
    def transalate(str):
        url = "http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule"     # 有道 云翻译内部访问的地址
        From_Data = {}
        From_Data['i']=str
        From_Data['from']='AUTO'
        From_Data['to']='AUTO'
        From_Data['smartresult']='dict'
        From_Data['client']='fanyideskweb'
        From_Data['salt']='1525344419877'
        From_Data['sign']='721bbfed345b0d955d8691221ed2b1e1'
        From_Data['doctype']='json'
        From_Data['version']='2.1'
        From_Data['keyfrom']='fanyi.web'
        From_Data['action']='FY_BY_REALTIME'
        From_Data['typoResult']='false'
    
        data = urllib.parse.urlencode(From_Data).encode('utf-8')       # 当字符串数据以url的形式传递给web服务器时,字符串中是不允许出现空格和特殊字符,因此我们需要转化格式
        # print(data)
        response = urllib.request.urlopen(url,data)     # 传递数据的形式,Get 方式访问
        html = response.read().decode('utf-8')
        # print(html)
        jsondata = json.loads(html)
        return jsondata['translateResult'][0][0]['tgt']         # 返回最终需要的数据(翻译的结果)
    
    str = input("输入你想翻译的文字:")
    result = transalate(str)
    print(result)       
    

    如果报“{“errorCode”:50}” ,可以在把
    Request URL:http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule
    将translate_o?中的_o去掉即可

    二. 爬取猫眼电影 top10

    1.每个电影 Item

    # -*- coding:utf-8 -*-
    class MovieItem(object):
        def __init__(self,rank ,name,stars ,time ,img_url):
            self.rank = rank
            self.name = name
            self.stars = stars
            self.time = time
            self.img_url = img_url
    
        def __str__(self):
            return str( self.rank)+" "+self.name+" "+str(self.stars)+" "+self.img_url+" " + str(self.time)
    
    

    2. 主要的爬虫代码

    # -*- coding:utf-8 -*-
    import re
    
    import requests
    
    from com.maoyan.Item import MovieItem
    from com.maoyan.Item import Stu
    
    url = "http://maoyan.com/board/4?offset=0"
    
    
    def get_main_content(html):
        patstr = '(<dd>.*?class="board-index.*?</dd>)'
    
        pattern = re.compile(patstr,re.S)
    
        dd_list = pattern.findall(string=html)
    
        itemlist = []
    
        for d in dd_list:       # 拿到每个页面的 dd 标签
            itemlist.append(d)  # 将每个电影的 dd 标签放到 list 中
    
        return itemlist
    
    def parse_itemlist(itemlist):
    
        # 采用贪婪方式匹配每个 dd 标签内容,后取分组信息
        parstr = '.*?<i class="board-index.*?>(.*?)</i>.*?<img src="(.*?)".*?<p class="name".*?<a.*?>(.*?)</a>.*?<p class="star">(.*?)</p.*?class="releasetime">(.*?)</p>.*?'
    
        # re.S 表示匹配所有的字符串,包括换行符 
        pattern = re.compile(parstr,re.S)
    
        itemList = []
    
        for elem in itemlist:
            m = pattern.match(elem)         # 得到匹配对象, 取分组
            rank = m.group(1)
            img_url = m.group(2)
            name = m.group(3)
            stars = m.group(4)
            stars =stars.strip()    # 去掉首尾的空字符
            time = m.group(5)
            item = MovieItem(rank,name,stars,time,img_url)
    
            itemList.append(item)
    
        return itemList
    
    def get_html(url):
        headers={
            "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36"
        }
        response = requests.get(url,headers=headers)
        return response.text
    
    
    if __name__ == "__main__":
        # self, rank, name, stars, time, img_url):
        html = get_html(url)            # 拿到网页的源码
        # print(html)
        itemlist = get_main_content(html)   # 拿到每个 dd 标签, 并封装到 list 中
        itemList = parse_itemlist(itemlist)            # 得到了每个 item 对象并封装到 list 中
        for elem in itemList:
            print(elem)
    

    结果

    1 霸王别姬 主演:张国荣,张丰毅,巩俐 //ms0.meituan.net/mywww/image/loading_2.e3d934bf.png 上映时间:1993-01-01
    2 肖申克的救赎 主演:蒂姆·罗宾斯,摩根·弗里曼,鲍勃·冈顿 //ms0.meituan.net/mywww/image/loading_2.e3d934bf.png 上映时间:1994-10-14(美国)
    3 罗马假日 主演:格利高里·派克,奥黛丽·赫本,埃迪·艾伯特 //ms0.meituan.net/mywww/image/loading_2.e3d934bf.png 上映时间:1953-09-02(美国)
    4 这个杀手不太冷 主演:让·雷诺,加里·奥德曼,娜塔莉·波特曼 //ms0.meituan.net/mywww/image/loading_2.e3d934bf.png 上映时间:1994-09-14(法国)
    5 教父 主演:马龙·白兰度,阿尔·帕西诺,詹姆斯·肯恩 //ms0.meituan.net/mywww/image/loading_2.e3d934bf.png 上映时间:1972-03-24(美国)
    6 泰坦尼克号 主演:莱昂纳多·迪卡普里奥,凯特·温丝莱特,比利·赞恩 //ms0.meituan.net/mywww/image/loading_2.e3d934bf.png 上映时间:1998-04-03
    7 唐伯虎点秋香 主演:周星驰,巩俐,郑佩佩 //ms0.meituan.net/mywww/image/loading_2.e3d934bf.png 上映时间:1993-07-01(中国香港)
    8 千与千寻 主演:柊瑠美,入野自由,夏木真理 //ms0.meituan.net/mywww/image/loading_2.e3d934bf.png 上映时间:2001-07-20(日本)
    9 魂断蓝桥 主演:费雯·丽,罗伯特·泰勒,露塞尔·沃特森 //ms0.meituan.net/mywww/image/loading_2.e3d934bf.png 上映时间:1940-05-17(美国)
    10 乱世佳人 主演:费雯·丽,克拉克·盖博,奥利维娅·德哈维兰 //ms0.meituan.net/mywww/image/loading_2.e3d934bf.png 上映时间:1939-12-15(美国)

    三. selenium 天猫信息

    操作:在天猫搜索框输入“手机”,获取手机的“页数”

    # -*-coding:utf-8 -*-
    from selenium.common.exceptions import TimeoutException
    from selenium.webdriver.common.by import By
    from selenium.webdriver.common.keys import Keys
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    from selenium import webdriver
    
    
    url = "http://www.tianmao.com"
    browser = webdriver.Chrome()
    wait = WebDriverWait(browser, 3)
    
    # 键入手机,得到手机的分页总数
    # 共80页,到第页 确定
    def search():
    
        try:
            browser.get(url)                                            # 键入淘宝首页
            input = wait.until(
                EC.presence_of_element_located((By.CSS_SELECTOR, "#mq"))          # 直到能定位到这个元素
            )
            # input.send_keys(Keys.ENTER)                               # 在输入框中键入回车
            submit = wait.until(                                        # 直到加载该元素后,定义该元素
                EC.element_to_be_clickable((By.CSS_SELECTOR, "#mallSearch > form > fieldset > div > button"))
            )
    
            input.send_keys("手机")                   # 向输入框中输入信息
            submit.click()                            # 点击查询按钮 , 会跳到另一个页面
    
            # 下面的操作是在另个页面操作
            total = wait.until(
                EC.presence_of_element_located((By.CSS_SELECTOR, "#content > div > div.ui-page > div > b.ui-page-skip > form"))
            )
    
            return total.text
        except TimeoutException:
            return search()
        finally:
            pass
    
    def main():
        result = search()
        print(result)
    
    if __name__=="__main__":
        main()
    

    四、爬取百度翻译(手机版)

    # -*-coding:utf-8 -*-
    import json
    import sys
    
    import requests
    
    
    class FanYi(object):
        def __init__(self, string):
            self.lang_detect_url = 'https://fanyi.baidu.com/langdetect'
            self.translate_url = 'https://fanyi.baidu.com/basetrans'
            self.headers = {
                'User-Agent':'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Mobile Safari/537.36'
            }
            self.string = string
    
        def get_request_result(self, url, data):
            response = requests.post(url, data, headers=self.headers)
            # 返回 json 格式的数据
            return json.loads(response.content.decode())
    
        def run(self):
            # 首先请求得到待文字的类型(中文/英文)在翻译的 url 中需要
            string = self.string
            data = {
                'query':string
            }
            # 得到请求翻译的文字的类型
            lang = self.get_request_result(self.lang_detect_url,data)['lan']
    
            # 请求翻译结果
            from_lang = 'zh'        # 假设默认是 中 -》 英
            to_lang = 'en'
    
            if lang=='en':      # 如果请求的文字是英文,则更换请求参数
                from_lang = 'en'
                to_lang = 'zh'
    
            translate_data = {
                'query': string,
                'from': from_lang,
                'to': to_lang
            }
    
            result = self.get_request_result(self.translate_url,data=translate_data)['trans'][0]['dst']
            print(result)
    
    def main():
        #表示从键盘录入待翻译的文字
        string = sys.argv[1]
        # fy = FanYi(string)
        fy = FanYi(string)
        fy.run()
    
    if __name__ == '__main__':
        main()
    
    展开全文
  • 比如非常难学的C语言,非常流行的Java语言,适合初学者的Basic语言,适合网页编程的JavaScript语言,那么零基础学Python之初识网络爬虫,今天我们先从网络爬虫的定义、与浏览器的相似之处网络请求等基础内容入手。...

    好程序员Python培训分享Python之初识网络爬虫,Python是一种怎样的计算机程序设计语言?你可能已经听说过很多种流行编程语言,比如非常难学的C语言,非常流行的Java语言,适合初学者的Basic语言,适合网页编程的JavaScript语言,那么零基础学Python之初识网络爬虫,今天我们先从网络爬虫的定义、与浏览器的相似之处和网络请求等基础内容入手。
      1、零基础学Python之初识网络爬虫—网络爬虫的定义
      网络爬虫(又被称为网页蜘蛛,网络机器人),是一种按照一定的规则,自动的抓取万维网信息的程序或者脚本,是搜索引擎的重要组成。传统爬虫从一个或若干初始网页的URL开始,获得初始网页上的URL,在抓取网页的过程中,不断从当前页面上抽取新的URL放入队列,直到满足系统的一定停止条件。
      2、零基础学Python之初识网络爬虫—网络爬虫与浏览器相似之处
      网络爬虫的抓取过程可以理解为 模拟浏览器操作的过程。
      浏览器的主要功能就是向服务器发出请求,在浏览器窗口中展示您选择的网络资源。这里所说的资源一般是指 HTML 文档,也可以是 PDF、图片或其他的类型。
      资源的位置由用户使用 URI(统一资源标示符)指定。
      浏览器解释并显示HTML文件的方式是在HTML和CSS规范中指定的。这些规范由网络标准化组织 W3C(万维网联盟)进行维护。
      3、零基础学Python之初识网络爬虫—网络爬虫抓什么
      一般来讲,抓取的内容主要来源于网页,目前,随着这几年移动互联网的发展,越来越多信息来源于移动互联网App、H5等,所以爬虫就不止局限于一定要抓取解析网页,还有移动互联网app、H5等的网络请求进行抓取
      对网络爬虫而言,需要抓取的是某个网站或者某个应用的内容,提取有用的价值。
      4、零基础学Python之初识网络爬虫—了解网络请求
      网络爬虫以HTTP、HTTPS请求为主,读取网页内容,提取有用的价值,内容一般分为两部分,非结构化的文本,或结构化的文本。
      超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。所有的WWW文件都必须遵守这个标准。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。

    展开全文
  • 小白入门python网络爬虫和信息提取(一)——requests库入门 第一次写CSDN的博客,正好这两天自己的兴趣突然产生了,自己摸索着学了一点网络爬虫的东西,写篇博客试一下。主要是课上学的都是C语言,C++面向对象,...
  • python爬虫-PyQuery详解

    2020-01-27 21:10:16
    PyQueryscrapy Selectors都是基于lxml模块,而lxml正则表达式都是C语言写的。 Beautifulsoup是用纯Python编写的。 正则表达式的构造稍微复杂一点,一般在结构化的网页中易出错。 我们声明...
  • Python之网络爬虫

    2018-11-07 00:50:44
    最近闲暇之余小编学习了Python中简单的网络爬虫技术,现在就来给大家分享一下,以下有两个版本,为测试版控制台版本(两个版本都做了详细的注释): 测试版: 一、.明确网络爬虫技术的编写步骤: 确定要爬取的...
  • Python爬虫 lxml库

    2019-08-14 09:36:39
    一、lxml库 lxml 是 一个HTML/XML的解析器,主要的功能是如何解析提取 HTML/XML 数据。 lxml正则一样,也是用 C 实现的,是一款高性能的 Python HTML/XML 解析器,我们可以利用之前...需要安装C语言库,可使...
  • 它基于C语言库libxml2 libxslt,进行了Python范儿(Pythonic)的绑定,成为一个具有丰富特性又容易使用的Python模块。虽然特性丰富,但是它在修改数节点时又缺少了些接口,比如本文讲到的获取 inner html 设置...
  • python爬虫之lxml库

    2019-11-21 13:14:23
    lxml正则一样,也是用C语言实现的,是一款高性能的Python HTML/XML解析器,我们可以i利用之前学习的XPath语法,来快速的定位元素及节点信息。 lxml python官方文档:http://lxml.de/index.html 需要安装C语言库...
  • python为什么叫爬虫作为一门编程语言而言,Python是纯粹的自由软件,以简洁清晰的语法强制使用空白符进行语句缩进的特点从而深受程序员的喜爱。举一个例子:完成一个任务的话,c语言一共要写1000行代码,java要写...
  • [B站视频]Python爬虫技术5天速成

    千次阅读 2020-06-16 00:22:54
    学习主题:Python爬虫和数据可视化 学习内容: (1)Python语言的基础知识 (2)网络爬虫的技术实现 (3)数据可视化的技术应用(框架、组件等) 学习目标: 了解网络爬虫和数据可视化的技术原理与流程 Python基础知识 认识...
  • Beautiful Soup模块使用Python编写,速度慢。安装:pip install beautifulsoup43、??? Lxml模块使用C语言编写,即快速又健壮,通常应该是最好的选择。(二)?? Lxml安装pip install lxml如果使用lxml的...
  • Python爬虫自学要多久?

    千次阅读 2019-12-05 14:22:47
    比如说,用Javascript编写动态网页,用Python去做爬虫抓取大数据、分析处理、数据可视化呈现。用C语言去驱动单片机,编写操作系统。用C++去制作画面精美的吃鸡游戏等等。 C++的优势就是可以用它来编写功能复杂,...
  • (一) 三种网页抓取方法 1、 正则表达式: ...模块使用Python编写,速度慢。 安装: pip install beautifulsoup4 3、 Lxml 模块使用C语言编写,即快速又健壮,通常应该是最好的选择。 (二) Lxml安装 ...
  • 原文出处:Andrew_liu python的网络变成比c语言...写这篇博文, 也希望回顾并整理一下以前学过的c语言和linux下一些东西, 会将一些Linux网络编程的函数和Python网络变成函数做一个简单的对照, 方便记忆 1. Soc...
  • 由于在Scrapy的依赖文件库中,pywin32Twisted的底层是基于C语言开发的,因此需要安装C语言的编译环境。 对于python3.6来说,可以通过安装Visual C++ Build Tools来安装这个环境。下载地址为:...
  • Python中常用的html数据抽取方法有正则、XPathBeautifulSoup这三种。其中,最常用的XPath库是lxml。今天再介绍一个库SimplifiedDoc,一起比较一下他们的优劣。 1、安装 名称 安装方法 包大小 说明 正则 不...
  • python爬虫批量下载美女吧美女图片

    千次阅读 2018-06-13 09:16:33
    前言: 昨天前天没有更新博客一方面的原因是我给一位学姐改进了一下毕业设计-----俄罗斯方块(C语言版),另一方面的原因就是我想利用xpath去抓取特定标签,但学习一天没有抓到,无奈只好用正则表达式去进行爬取...
  • 1.)由于scrapy依赖非常多的第三方库,又由于Scrapy的依赖库文件中,pywin32Twisted的底层是基于C语言开发的,因此需要安装C语言的编译环境。对于Python3.7.3来说,可以通过安装Visual C++ Build Tools来安装这个...
  • 1991年第一个Python解释器公开版发布,它是用C语言编写实现的,并能够调用C语言的库文件。Python一诞生就已经具有了类、函数异常处理等内容,包含字典、列表等核心数据结构,以及模块为基础的拓展系统。2000年...
  • 人工智能第一章:Python语言基础+爬虫

    千次阅读 多人点赞 2020-06-23 11:57:13
    Python的作者是著名的“龟叔”Guido van Rossum,他希望有一种语言,这种语言能够像C语言那样,能够全面调用计算机的功能接口,又可以像shell那样,可以轻松的编程。龟叔从ABC语言看到希望,ABC语言是由荷兰的数学...
  • Python的作者是著名的“龟叔”Guido van Rossum,他希望有一种语言,这种语言能够像C语言那样,能够全面调用计算机的功能接口,又可以像shell那样,可以轻松的编程。龟叔从ABC语言看到希望,ABC语言是由荷兰的数学...
  • 笔者是一名普通高校的电子信息与科学技术专业的学生,本该安安心心学习c语言和c++,但是迫于自己求知欲的驱动(笑~~~),以及后来一些项目的需要,就开始学习python爬虫啦,也希望这个系列的帖子可以作为其他初学...

空空如也

空空如也

1 2 3 4 5 6
收藏数 107
精华内容 42
关键字:

c语言爬虫和python爬虫

python 订阅
c语言 订阅
爬虫 订阅