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, '\n']))
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)
人生苦短,我用python!