zoukankan      html  css  js  c++  java
  • python爬虫学习:第一爬_快眼看书排行榜

     1 import json
     2 import re
     3 from urllib.request import urlopen    # urllib用法:https://www.jb51.net/article/65279.htm
     4 
     5 # 思路:通过url获取网页内容--》匹配需要内容---》拿到内容写入文件
     6 
     7 
     8 def get_page(url):
     9     """
    10     获得网页代码字符串,以便操作
    11     :param url: 传入网址
    12     :return:  返回utf编码得字符串
    13     """
    14  # respond对象有一个方法叫着read(),用它读出来是一个bytes类型得数据,需要转码
    15     respond = urlopen(url)  
    16     return respond.read().decode('utf-8')  
    17 # 如果不用,将返回得是一个对象 <http.client.HTTPResponse object at 0x000001E25553EE10>
    18 
    19 # 将得到的字符串传入,通过正则匹配出需要的内容,返回
    20 def parse_page(s_strfile, pattern):
    21     """
    22     通过正则去匹配传入的字符串,得到想要的内容
    23     为节约时间,因为每次都要用相同的正则规则去匹配我想要的内容,故可以将正则配置成一个对象,然后对象通过调用方法查值
    24     为节约空间,可用迭代器取值,乘上将对象封装成一个生成器,每次取一个,节约内存
    25     :param s_strfile:
    26     :return:
    27     """
    28     # com = re.compile('<td class="s">.*?<a href=.*?>(?P<x_name>.*?)</a>.*?<a href=.*?>(?P<x_title>.*?)</a>'
    29     #                   '.*?<td class="t">(?P<x_time>.*?)</td>', re.S)
    30     # 两行和一行一样的效果
    31     # com = re.compile(
    32     #     '<td class="s">.*?<a href=.*?>(?P<x_name>.*?)</a>.*?<a href=.*?>(?P<x_title>.*?)</a>.*?<td class="t">(?P<x_time>.*?)</td>',
    33     #     re.S)
    34     # 上面是将正则通过方法compile构建成一个对象
    35 
    36     # 先试着通过findall可以全部取出,但很占内存,故查找结果存储,计划构建成一个生成器,一次取一个
    37     # page = com.findall(s_strfile)
    38     # print(page)
    39 
    40     ret = pattern.finditer(s_strfile)  # 此方法比findall要节省内存,取值用all
    41     for i in ret:
    42         yield {'name': i.group('x_name'),
    43                'title': i.group('x_title'),
    44                'time': i.group('x_time')}
    45 
    46 
    47 def main(page_num, pattern):
    48     """
    49     接收运行次数及正则规则,写入文件
    50     :param page_num:
    51     :param pattern:
    52     :return:
    53     """
    54     url = 'http://booksky.99lb.net/sodupaihang/page%s' % page_num
    55     response_html_code = get_page(url)
    56     ret = parse_page(response_html_code, pattern)
    57     with open('xiaoshuo_info.txt', 'a', encoding='utf-8') as f:
    58         for data in ret:
    59             write_line_str = json.dumps(data, ensure_ascii=False)  # json 为字符串
    60             f.write(''.join([write_line_str, '
    ']))
    61 
    62 
    63 # 编译正则规则为一个对象,放在全局变量,只需编译一次即可,省时间
    64 pattern = re.compile(
    65     '<td class="s">.*?<a href=.*?>(?P<x_name>.*?)</a>.*?<a href=.*?>(?P<x_title>.*?)
    66 </a>.*?<td class="t">(?P<x_time>.*?)</td>',
    67     re.S)
    68 
    69 if __name__ == '__main__':
    70     for num in range(1, 11):
    71         main(num, pattern)
  • 相关阅读:
    Codeforces 375D Tree and Queries(DFS序+莫队+树状数组)
    HDU 5972 Regular Number(字符串shift
    HDU 5905 Black White Tree(树型DP)
    BZOJ 3675 [Apio2014]序列分割 (斜率优化DP)
    2017 ACM/ICPC Asia Regional Guangxi Online 记录
    2017 ACM/ICPC Asia Regional Beijing Online 记录
    2017 ACM/ICPC Asia Regional Xian Online 记录
    2017 ACM/ICPC Asia Regional Qingdao Online 记录
    django中models字段的联合限制
    redis使用摘要
  • 原文地址:https://www.cnblogs.com/sunxiuwen/p/9307265.html
Copyright © 2011-2022 走看看