• 爬虫day03 cast


    关于数据:

    分为结构化数据和非结构化数据:

                                                

    XML  和 HTML 的区别:

    前者是用来传输数据的,后者是用来展示数据的。 

    因为HTML中有单标签,所以不是结构化的数据,而XML则都是单标签,是结构化的数据。

    json模块 的使用:

     1 import json
     2 
     3 # python 的字典 ---> json 的字符串
     4 def test01():
     5     '''
     6     json 数据解析  和字符串相关的都加上s
     7     python 的字典 ---> json 的字符串
     8     '''
     9     dict_01 = {
    10         "name":"tom",
    11         "age":18
    12     }
    13     ret =  json.dumps(dict_01)
    14     print(ret,type(ret)) #str
    15 
    16 # json 的字符串 ---> python 的字典
    17 def test02():
    18     '''
    19     json 数据解析  和字符串相关的都加上s
    20     json 的字符串 ---> python 的字典
    21     '''
    22     json_str =''' {
    23         "name":"tom",
    24         "age":"18"
    25     }'''  #注:json 的key  value 必须是双引号
    26     ret =  json.loads(json_str)
    27     print(ret,type(ret)) #dict
    28 
    29 # python 的字典 ---> json 的文件
    30 def test03():
    31     '''
    32     json 数据解析
    33     python 的字典 ---> json 的文件
    34     '''
    35     dict_01 = {
    36         "name": "tom",
    37         "sex":"",
    38         "age": 18
    39     }
    40     fp = open("01json.json",'w',encoding="utf8")
    41     json.dump(dict_01,fp, ensure_ascii=False )  #ensure_ascii 这时,json 文件中的 中文就能显示了
    42     fp.close()
    43 
    44 # json 的文件  --->  python 的字典
    45 def test04():
    46     '''
    47     json 数据解析
    48     json 的文件  --->  python 的字典
    49     '''
    50     fp = open("01json.json",'r')
    51 
    52     dict_01 = json.load(fp)
    53     print(dict_01,type(dict_01))  #{'age': 18, 'sex': '男', 'name': 'tom'} <class 'dict'>
    54     fp.close()
    55 
    56 
    57 if __name__ == '__main__':
    58     # test01()
    59     # test02()
    60     # test03()
    61     # test04()
    62     pass
    python 的字典 和 字符串 和 文件的转换!

    jsonpath 模块使用:

    这是个第三方库,

    只需要先记住 跨节点 取元素。  $..key !  

     1 import jsonpath
     2 import json
     3 
     4 def test():
     5     with open("1.json","r",encoding="utf8") as f:
     6         json_str = f.read()
     7     # print(type(json_str),json_str)
     8 
     9     #使用jsonpath 解析json字符串
    10 
    11     #先将json_str 转为列表
    12     data_list = json.loads(json_str)
    13     # print(type(data),data) #list  !
    14     list_name = jsonpath.jsonpath(data_list,"$..title") #第一个参数 得是Python  dict/list
    15     list_score = jsonpath.jsonpath(data_list,"$..score")
    16     # print(list_name)
    17     # print(list_score)
    18 
    19     result = zip(list_name,list_score)
    20     print(list(result))
    21 
    22     #将结果 python的 list  写入到json 文件中!
    23     fp = open("2.json","w",encoding="utf8")
    24     json.dump(list_name,fp,ensure_ascii=False) #存入电影名字
    25     # json.dump(list_score,fp,ensure_ascii=False) #存入豆瓣评分
    26 
    27 
    28 
    29 
    30 if __name__ == '__main__':
    31     test()
    jsonpath 的使用
     1 import re
     2 
     3 
     4 def test():
     5     pattern = re.compile("a(.*?)b")  #.* 后面加个问号就是非 贪婪的
     6 
     7     data = '''
     8         ahhhhhb
     9         cccc
    10         dddb
    11     '''
    12     ret_list = pattern.findall(data)
    13     print(ret_list)
    14 
    15     pass
    16 
    17 
    18 
    19 
    20 if __name__ == '__main__':
    21     test()
    正则

    用的最多的还是 findall()  !!! 

     1 import re
     2 
     3 
     4 def test():
     5     #1,正则中的sub 方法  替换 substitude
     6     data ="1_2_3_4"
     7     pattern = re.compile( "_")
     8     ret =  pattern.sub('',data)   #使用.sub() 来替换字符串  它比字符串的方法.replace() 爽的多。
     9     print(ret)
    10 
    11     #使用sub 还可以调换顺序
    12     data2 = "hello wolrd ABC d"
    13     pattern2= re.compile("(w+) (w+)")
    14     ret2 = pattern2.sub(r"2 1",data2)
    15     print(ret2)
    16 
    17     #2,正则中的split 方法   分割
    18     pattern3 = re.compile("[,;?]")
    19     data3 = "Hello w,fdj,fdjask;df;a,?fdsjkf"
    20     ret3 = pattern3.split(data3)
    21     print(ret3)
    22 
    23 
    24     #3,汉字 在Unicode 中有个范围! [u4e00 - u9fa5]
    25     data4 = "我爱你中国,hahah .tom 我要去看电影,你去吗? "
    26     pattern4 = re.compile("[u4e00-u9fa5]+")
    27     ret4 = pattern4.findall(data4)
    28     print(ret4)
    29 
    30 if __name__ == '__main__':
    31     test()
    正则中的 sub split 还有 汉字的unicode 范围
     1 import random
     2 import requests
     3 import re
     4 import json
     5 
     6 USER_AGENT = [
     7     "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 UBrowser/4.0.3214.0 Safari/537.36",
     8     # IPhone
     9     "Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_3_3 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5",
    10     # IPod
    11     "Mozilla/5.0 (iPod; U; CPU iPhone OS 4_3_3 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5",
    12     # IPAD
    13     "Mozilla/5.0 (iPad; U; CPU OS 4_2_1 like Mac OS X; zh-cn) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8C148 Safari/6533.18.5",
    14     "Mozilla/5.0 (iPad; U; CPU OS 4_3_3 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5",
    15     # Android
    16     "Mozilla/5.0 (Linux; U; Android 2.2.1; zh-cn; HTC_Wildfire_A3333 Build/FRG83D) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",
    17     "Mozilla/5.0 (Linux; U; Android 2.3.7; en-us; Nexus One Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",
    18     # QQ浏览器 Android版本
    19     "MQQBrowser/26 Mozilla/5.0 (Linux; U; Android 2.3.7; zh-cn; MB200 Build/GRJ22; CyanogenMod-7) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",
    20     # Android Opera Mobile
    21     "Opera/9.80 (Android 2.3.4; Linux; Opera Mobi/build-1107180945; U; en-GB) Presto/2.8.149 Version/11.10",
    22     # Android Pad Moto Xoom
    23     "Mozilla/5.0 (Linux; U; Android 3.0; en-us; Xoom Build/HRI39) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13",
    24     # BlackBerry
    25     "Mozilla/5.0 (BlackBerry; U; BlackBerry 9800; en) AppleWebKit/534.1+ (KHTML, like Gecko) Version/6.0.0.337 Mobile Safari/534.1+",
    26     # WebOS HP Touchpad
    27     "Mozilla/5.0 (hp-tablet; Linux; hpwOS/3.0.0; U; en-US) AppleWebKit/534.6 (KHTML, like Gecko) wOSBrowser/233.70 Safari/534.6 TouchPad/1.0",
    28     # Nokia N97
    29     "Mozilla/5.0 (SymbianOS/9.4; Series60/5.0 NokiaN97-1/20.0.019; Profile/MIDP-2.1 Configuration/CLDC-1.1) AppleWebKit/525 (KHTML, like Gecko) BrowserNG/7.1.18124",
    30     # Windows Phone Mango
    31     "Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; Titan)",
    32     # UC浏览器
    33     "UCWEB7.0.2.37/28/999",
    34     "NOKIA5700/ UCWEB7.0.2.37/28/999",
    35     # UCOpenwave
    36     "Openwave/ UCWEB7.0.2.37/28/999",
    37     # UC Opera
    38     "Mozilla/4.0 (compatible; MSIE 6.0; ) Opera/UCWEB7.0.2.37/28/999"
    39 ]
    40 
    41 class GuoKr:
    42     def __init__(self):
    43         self.base_url = "https://www.guokr.com/ask/tag/历史/"
    44         self.headers = {"User-Agent":random.choice(USER_AGENT)}
    45         pass
    46 
    47     #1,发送请求
    48     def send_request(self):
    49         response = requests.get(self.base_url,headers = self.headers)
    50         return response.content.decode("utf8")
    51 
    52     #2,分析数据
    53     def parse_data(self,data):
    54         pattern = re.compile('<h2><a target="_blank" href="(.*)">(.*)</a></h2>')
    55         return pattern.findall(data)
    56 
    57     #3,保存数据
    58     def write_file(self,data):
    59         # with open("guoke.html","w",encoding="utf8") as f:
    60         #     f.write(data)
    61         with open("guoke.json","w",encoding="utf8") as f:
    62             json.dump(data,f,ensure_ascii=False)
    63 
    64 
    65     #4,调度
    66     def run(self):
    67         data = self.send_request()
    68         parased_data = self.parse_data(data)
    69         self.write_file(parased_data)
    70 
    71 if __name__ == '__main__':
    72     GuoKr().run()
    使用正则抓 果壳上的内容
  • 相关阅读:
    springboot的@EnableAutoConfiguration起作用的原理
    springboot加载bean过程探索
    dubbo源码阅读笔记-如何引用远程服务,变成invoker
    HashMap如何实现序列化
    如果处理缓存失效从数据库加载数据
    redis设计原则
    redis相关运维命令
    spring的compentScan注解扫描类机制
    全文检索技术
    前端设计网站
  • 原文地址:https://www.cnblogs.com/zach0812/p/12004739.html
Copyright © 2020-2023  润新知