美文网首页我的专题Python爬虫python爬虫日记本
python3——提取信息手段和一些模板

python3——提取信息手段和一些模板

作者: X_xxieRiemann | 来源:发表于2017-05-06 23:30 被阅读52次
    (1)正则表达式
    1. http://cuiqingcai.com/977.html
    2. http://www.cnblogs.com/huxi/archive/2010/07/04/1771073.html
      废话不多说,直接一图流:
      转CSDN
      注:\D、\S(大写)、\w(小写)可以匹配到汉字
    (2)BeautifulSoup
    1. http://cuiqingcai.com/1319.html
    2. beautiful soup选择器之CSS选择器
      第三方库需要下载,在命令提示符窗口输入:
    pip install beautifulsoup4
    pip install lxml
    

    一开始主要用的find和findall函数,后来发现select函数很好用。

    # 选择a标签,其属性中存在myname的所有标签
    soup.select("a[myname]")
    # 选择a标签,其属性href=http://example.com/lacie的所有标签,同理可用于class、id、name等其他属性
    #注意:别乱用空格,当属性含有空格时,用.代替
    soup.select("a[href='http://example.com/lacie']")
    # 选择a标签,其href属性包含.com
    soup.select('a[href*=".com"]')
    #几乎什么都能找到 ,p(属性为story)子标签中的第二个a标签
    k = soup.select("p[class='story']  > a:nth-of-type(2)")
    #或者这样。  class的属性用.代替,id用#代替
    k = soup.select("p.story  > a:nth-of-type(2)")
    #p(属性为story)后代标签中的a标签
    k = soup.select("p[class='story'] a")
    #其中k仍然可以继续用select
    
    #匹配标签a中href属性的内容
    a['href']
    #匹配标签a中src属性的内容
    a['src']
    #匹配标签a中的文字内容
    a.get_text()
    

    .string和.text和.get_text()的区别 (点我查看

    (3)xpath

    转自: http://www.w3school.com.cn/xpath/xpath_syntax.asp

    from lxml import etree
    selector = etree.HTML(html)
    #其中//h4/a/text()就是一条规则
    links = selector.xpath('//h4/a/text()')
    for link in links:
      print(link)
    

    规则说明:



    实例:


    (4)一些模板
    #简洁快速生成url列表
    urls = ['https://book.douban.com/tag/小说?start={}'.format(str(i)) for i in range(0, 2000, 20)]
    for url in urls:
        #调用打开网页的函数
        open_url(url)
        #继续处理其它事情
    

    对于多个并列的结果,可用zip同时表示出来:

    #常见模板,用于一些并列结果输出,比如火车车次和时间,电影名字和演员、上映时间等等
    name = ['Kite', 'Jane', 'Ben', 'Michael', 'Maria']
    num = [11, 23, 3, 14, 52]
    dic = {}
    for i, j in zip(name, num):
        dic = {'名字':i, '学号':j}
        print(dic)
    
    运行结果:
    {'学号': 11, '名字': 'Kite'}
    {'学号': 23, '名字': 'Jane'}
    {'学号': 3, '名字': 'Ben'}
    {'学号': 14, '名字': 'Michael'}
    {'学号': 52, '名字': 'Maria'}
    
    #常见模板,用于一些并列结果输出,比如火车车次和时间,电影名字和演员、上映时间等等
    name = ['Kite', 'Jane', 'Ben', 'Michael', 'Maria']
    num = [11, 23, 3, 14, 52]
    list = []
    for i, j in zip(name, num):
        list.append([i, j])
    print(list)
    
    运行结果:
    [['Kite', 11], ['Jane', 23], ['Ben', 3], ['Michael', 14], ['Maria', 52]]
    
    name = ['Kite', 'Jane', 'Ben', 'Michael', 'Maria']
    num = [11, 23, 3, 14, 52]
    list = list(zip(name, num))
    print(iist)
    
    运行结果:
    [('Kite', 11), ('Jane', 23), ('Ben', 3), ('Michael', 14), ('Maria', 52)]
    

    在给文件命名时,几个常用的字符串用法

    #把s中的oldstr替换成newstr,count为替换次数,常用于换掉\n或冒号等一些不能用于命名的符号
    s.replace(oldstr, newstr, [count])
    #把s中的chars全部去掉,默认是去掉前后空格(中间的空格保留)
    s.strip([chars])
    
    #以sep为分隔符,把s拆分成一个列表,默认分隔符为空格,maxsplit为拆分次数,默认-1,表示无限制拆分
    s.split([sep,[maxsplit]])
    #把seq的序列组合成字符串,用s把各元素连接。
    s.join(seq)
    
    #s是否全是字母,且至少有一个字符
    s.isalpha()
    #s是否全是数字,且至少有一个字符
    s.isdigit()
    

    储存到文件夹中

    import os
    #判断文件夹是否已经存在
    ISexist = os.path.exists(os.path.join("F:\\comic", name))
    #构造一个列表,读取已有的文件夹名字
    Oslist = os.listdir('F:\\comic')
    #如果文件夹已经存在,则不重复保存,直接跳过。起到粗糙的去重效果
    #缺点是如果上一次爬取失败,须把失败的文件夹删了继续,才能保证爬到完整的漫画
    if name in Oslist:
        continue
    #如果文件夹不存在,则创建文件夹,并设为当前位置,否则只改变当前位置
    if not ISexist:
        os.makedirs(os.path.join("F:\\comic", name)) 
        os.chdir("F:\\comic\\"+name)
    else:    
        os.chdir("F:\\comic\\"+name)
    

    存到csv中:

    #输入要存储的列表,格式为[['Jack',21,166], ['Ben',25,168]]这样的。
    def csv_write(tablelist):
        tableheader = ['姓名', '年龄', '身高']#表头
        with open('danmu.csv', 'w', newline='', errors='ignore') as f:
            writer = csv.writer(f)
            writer.writerow(tableheader)
            for row in tablelist:
                writer.writerow(row)
    

    多进程

    from multiprocessing import Pool
    #实例化一个进程池,设置进程为2
    pool = Pool(processes=2)
    #调用进程池的map_async()方法,接收一个函数(爬虫函数)和一个列表(url列表)
    pool.map_async(fun, urllist)
    pool.close()
    pool.join()
    

    将从浏览器上复制的cookie的字符串形式改成字典形式:

    import re
    cookie_str = 'BIDUPSID=3B969BA15A49F86AD6B6074EE47; PSTM=147255150; TIEBA_USERTYPE=5e2d54c3970b9b374dd403d9; bdshare_firstime=1474551482398; TIEBAUID=f43269109e3e8b9f1e9fe9; rpln_guide=1; __=db366b9463b731462643c8c17fc459f1476540234; BAIDUID=910C74C21424113A6D5B9D173FEDD375:FG=1; FP_UID=6269514cb1281e1cb1afbd5be5bd45a8'
    cookie_dic = dict(re.findall(r'(.*?)=(.*?);\s*', cookie_str + '; '))
    print(cookie_dic)
    
    运行结果:
    {'TIEBA_USERTYPE': '5e2d54c3970b9b374dd403d9', 'TIEBAUID': 'f43269109e3e8b9f1e9fe9', '__': 'db366b9463b731462643c8c17fc459f1476540234', 'FP_UID': '6269514cb1281e1cb1afbd5be5bd45a8', 'PSTM': '147255150', 'BAIDUID': '910C74C21424113A6D5B9D173FEDD375:FG=1', 'rpln_guide': '1', 'BIDUPSID': '3B969BA15A49F86AD6B6074EE47', 'bdshare_firstime': '1474551482398'}
    

    相关文章

      网友评论

      • 狗妈妈2:写的好好,总结的也不错,我要好好研读

      本文标题:python3——提取信息手段和一些模板

      本文链接:https://www.haomeiwen.com/subject/ifnpzttx.html