1 # = 学习网址:http://c.biancheng.net/view/2011.html 2 3 4 # =================================================== 5 # import requests # = 导入requests包,加载 requests 库 6 # # = 没有需要安装,File>settings...>Project Interpreter>确认当前选择的编译器,然后单击右上角的加号>搜索框输入:requests,安装 7 8 # url = 'http://www.cntour.cn/' 9 # strhtml = requests.get(url) # = Get方式获取网页数据(源代码),将获取到的数据存到 strhtml 变量中 10 # print(strhtml.text) # = 这个时候 strhtml 是一个 URL 对象,它代表整个网页,但此时只需要网页中的源码.txt表示网页源码: 11 12 13 14 15 # =================================================== 16 # = 快捷键 F12,开发者模式,依次单击“Network”按钮和“XHR”按钮,找到翻译数据,如图 13 所示: 17 # = 单击 Headers,发现请求数据的方式为 POST。如图 14 所示: 18 # = 首先,将 Headers 中的 URL 复制出来,并赋值给 url,代码如下: 19 # = url = 'http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule' 20 # = POST 的请求获取数据的方式不同于 GET,POST 请求数据必须构建请求头才可以。 21 # = Form Data 中的请求参数将其复制并构建一个新字典: 22 # = From_data={'i':'我愛中國','from':'zh-CHS','to':'en','smartresult':'dict','client':'fanyideskweb','salt':'15477056211258' 23 # ,'sign':'b3589f32c38bc9e3876a570b8a992604','ts':'1547705621125','bv':'b33a2f3f9d09bde064c9275bcb33d94e', 24 # 'doctype':'json','version':'2.1','keyfrom':'fanyi.web','action':'FY_BY_REALTIME','typoResult':'false'} 25 26 # = 接下来使用 requests.post 方法请求表单数据,代码如下: 27 # = import requests #导入requests包 28 29 # = response = requests.post(url,data=From_data) 30 # = 将字符串格式的数据转换成 JSON 格式数据,并根据数据结构,提取数据,并将翻译结果打印出来,代码如下: 31 # = import json 32 # = content = json.loads(response.text) 33 # = print(content['translateResult'][0][0]['tgt']) 34 35 36 # import requests #导入requests包 37 # import json #JSON 格式数据 38 # def get_translate_date(word): 39 # url = 'https://fanyi.baidu.com/v2transapi?from=zh&to=en' 40 # From_data = {'from': 'zh', 41 # 'to': 'en', 42 # 'query': '中国', 43 # 'transtype': 'realtime', 44 # 'simple_means_flag': '3', 45 # 'sign': '777849.998728', 46 # 'token': '3542a3db15f4ab784a54a89267bf03a6', 47 # 'domain': 'common'} 48 # #请求表单数据 49 # response = requests.post(url,data=From_data) 50 # # print(response.text) 51 # #将Json格式字符串转字典 52 # content = json.loads(response.text) 53 # print(content) 54 # #打印翻译后的数据 55 # # print(content['translateResult'][0][0]['tgt']) 56 # if __name__=='__main__': 57 # get_translate_date('中国') 58 59 60 61 62 63 # =================================================== 64 # # = 通过 requests 库已经可以抓到网页源码,接下来要从源码中找到并提取数据。Beautiful Soup 是 python 的一个库, 65 # # = 其最主要的功能是从网页中抓取数据。Beautiful Soup 目前已经被移植到 bs4 库中,也就是说在导入 Beautiful Soup 时需要先安装 bs4 库。 66 67 # # = 还需安装 lxml 库。如果我们不安装 lxml 库,就会使用 Python 默认的解析器。尽管 Beautiful Soup既支持Python标准库中的HTML解析器 68 # # = 又支持一些第三方解析器,但是 lxml 库具有功能更加强大、速度更快的特点,因此笔者推荐安装 lxml 库。 69 70 # import requests #导入requests包 71 # from bs4 import BeautifulSoup 72 73 # url='http://www.cntour.cn/' 74 # strhtml=requests.get(url) 75 76 # # = 首先,HTML 文档将被转换成 Unicode 编码格式,然后 Beautiful Soup 选择最合适的解析器来解析这段文档, 77 # # = 此处指定 lxml 解析器进行解析。解析后便将复杂的 HTML 文档转换成树形结构,并且每个节点都是 Python 对象。 78 # # = 这里将解析后的文档存储到新建的变量 soup 中,代码如下: 79 # 80 # soup=BeautifulSoup(strhtml.text,'lxml') 81 # 82 # # = 接下来用 select(选择器)定位数据,需要使用浏览器的开发者模式,将鼠标光标停留在对应的数据位置并右击,然后在快捷菜单中选择“检查”命令: 83 # # = 随后在浏览器右侧会弹出开发者界面,右侧高亮的代码(参见图 19(b))对应着左侧高亮的数据文本(参见图 19(a))。 84 # # = 右击右侧高亮数据,在弹出的快捷菜单中选择“Copy”➔“Copy Selector”命令,便可以自动复制路径。 85 # # = 将路径粘贴在文档中,代码如下: 86 # # = #main > div > div.mtop.firstMod.clearfix > div.centerBox > ul.newsList > li:nth-child(1) > a 87 # # = 由于这条路径是选中的第一条的路径,而我们需要获取所有的头条新闻,因此将 li:nth-child(1)中冒号(包含冒号)后面的部分删掉: 88 # 89 # data = soup.select('#main>div>div.mtop.firstMod.clearfix>div.centerBox>ul.newsList>li>a') 90 # print(data) 91 # 92 # 93 # # = 首先明确要提取的数据是标题和链接,标题在<a>标签中,提取标签的正文用 get_text() 方法。 94 # # = 链接在<a>标签的 href 属性中,提取标签中的 href 属性用 get() 方法,在括号中指定要提取的属性数据,即 get('href')。 95 # 96 # # for item in data: 97 # # result={ 98 # # 'title':item.get_text(), 99 # # 'link':item.get('href') 100 # # } 101 # # print(result) 102 # 103 # 104 # # = 文章的链接中有一个数字 ID。下面用正则表达式提取这个 ID。需要使用的正则符号如下: 105 # # = \d 匹配数字 + 匹配前一个字符1次或多次 106 # # = 在 Python 中调用正则表达式时使用 re 库,这个库不用安装,可以直接调用。在 PyCharm 中输入以下代码: 107 # import re 108 # 109 # for item in data: 110 # result={ 111 # "title":item.get_text(), 112 # "link":item.get('href'), 113 # 'ID':re.findall('\d+',item.get('href')) 114 # } 115 # print(result) 116 117 # ===================================================# =================================================== 118 # ===================================================# =================================================== 119 120 # 爬虫,反爬虫 121 # 在进行访问时,我们在开发者环境下不仅可以找到 URL、Form Data,还可以在 Request headers 中构造浏览器的请求头,封装自己。 122 # 服务器识别浏览器访问的方法就是判断 keyword 是否为 Request headers 下的 User-Agent 123 124 # headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36'} 125 # response = request.get(url,headers=headers) 126 127 128 # # # 统计每个IP的访问频率,该频率超过阈值,就会返回一个验证码,如果真的是用户访问的话,用户就会填写,然后继续访问,如果是代码访问的话,就会被封 IP。 129 # # # 这个问题的解决方案有两个,第一个就是常用的增设延时,每 3 秒钟抓取一次,代码如下: 130 # import time 131 # time.sleep(3) 132 133 134 135 # # 为避免被封 IP,在数据采集时经常会使用代理。当然,requests 也有相应的 proxies 属性。 136 # # 首先,构建自己的代理 IP 池,将其以字典的形式赋值给 proxies,然后传输给 requests,代码如下: 137 # 138 # proxies={ 139 # "http":"http://10.10.1.10:3128", 140 # "https":"http://10.10.1.10:1080", 141 # } 142 # response = requests.get(url, proxies=proxies) 143 144 145 146 147 # ===================================================# =================================================== 148 # import json 149 # #引用json,json是一种跨平台的轻量级数据交换语言。 150 # jsonres = json.loads(res.text) 151 # #使用json来解析res.text,并存储在jsonres中 152 # for x in jsonres: 153 # #jsonres最外层是一个列表。x是字典 154 # print(x) 155 # #打印出每一个具体的东西,当然你对代码有一定了解也可以保存下来甚至转换为文件保存到本地 156 157 158 159 # 请在下面的 Begin-End 之间按照注释中给出的提示编写正确的代码 160 ########## Begin ########## 161 162 # import requests 163 # 164 # # 国防科技大学本科招生信息网中录取分数网页URL: 165 # url = 'http://www.gotonudt.cn/site/gfkdbkzsxxw/lqfs/index.html' # 录取分数网页URL 166 167 # def spider(): 168 # # 将网页内容保存到data 169 # date0 = requests.get(url) 170 # date = date0.text 171 # # 2.将data写入“nudt.txt”文件中 172 # # f = open(r"src/step1/nudt.txt", 'w') 173 # f = open(r"nudt.txt", 'w') 174 # f.write(date) 175 # f.close() 176 # 177 # if __name__ == '__main__': 178 # spider() 179 180 ########## End ########### 181 # =================================================== 182 # =================================================== 183 184 # 注意:本关只要抽取具体的数值,该表中前三行分别为标题、类别和分数分类的具体描述,这三行的数据不需要保存。 185 # -*- coding: utf-8 -*- 186 import requests 187 import re 188 189 # 国防科技大学本科招生信息网中2016年录取分数网页URL: 190 url = 'http://www.gotonudt.cn/site/gfkdbkzsxxw/lqfs/info/2017/717.html' 191 192 webpage = requests.get(url) # 根据超链访问链接的网页 193 data = webpage.content # 读取超链网页数据 194 data = data.decode('utf-8') # byte类型解码为字符串 195 196 # 获取网页中的第一个表格中所有内容: 197 table = re.findall(r'<table(.*?)</table>', data, re.S) 198 firsttable = table[0] # 取网页中的第一个表格 199 # 数据清洗,将表中的 ,\u3000,和空格号去掉 200 firsttable = firsttable.replace(' ', '') 201 firsttable = firsttable.replace('\u3000', '') 202 firsttable = firsttable.replace(' ', '') 203 204 def spider(): 205 score = [] 206 # 请按下面的注释提示添加代码,完成相应功能,若要查看详细html代码,可在浏览器中打开url,查看页面源代码。 207 # ********** Begin **********# 208 # 按tr标签对获取表格中所有行,保存在列表rows中: 209 rows = re.findall(r'<tr(.*?)</tr>',firsttable,re.S) 210 211 # 迭代rows中的所有元素,获取每一行的td标签内的数据,并把数据组成item列表,将每一个item添加到scorelist列表: 212 scorelist = [] 213 i0 = 0 214 for i in rows: 215 item = re.findall(r'<td(.*?)</td>',i,re.S) 216 i0 = i0 +1 217 if i0 < 4: 218 continue 219 scorelist.append(item) 220 221 # 将由省份,分数组成的8元列表(分数不存在的用/代替)作为元素保存到新列表score中,不要保存多余信息 222 for p in scorelist: 223 score0 = [] 224 for i in range(0,8): 225 if p[i] is not None: 226 item = re.findall(r'<span.*?><span.*?>(.*?)</span>',p[i], re.S) 227 else: 228 item = [r"/"] 229 item = item[0] 230 score0.append(item) 231 score.append(score0) 232 233 # ********** End **********# 234 return score 235 236 print("各省分数线如下:") 237 print(spider()) 238 239 240 # ===================================================# =================================================== 241 # ===================================================# =================================================== 242 # ===================================================# =================================================== 243 # 函数re.findall() 244 # 从 string 中查找所有符合 pattern 正则表达式模式的子串,以这些子串作为列表元素返回一个列表。 245 # 参数说明: 246 # 247 # pattern:要搜寻的正则表达式; 248 # 249 # string:要检索的字符串; 250 # 251 # 1、. 匹配任意除换行符“\n”外的字符; 252 # 2、*表示匹配前一个字符0次或无限次; 253 # 3、?表示前边字符的0次或1次重复 254 # 4、+或*后跟?表示非贪婪匹配,即尽可能少的匹配,如*?重复任意次,但尽可能少重复; 255 # 5、 .*? 表示匹配任意数量的重复,但是在能使整个匹配成功的前提下使用最少的重复。 256 # 如:a.*?b匹配最短的,以a开始,以b结束的字符串。如果把它应用于aabab的话,它会匹配aab和ab。 257 # 258 # flag:可选项,可设置搜索的要求。可以选择输入re.S,re.I等。re.S:如果不使用re.S参数,则只在每一行内进行匹配, 259 # 如果一行没有,就换下一行重新开始,不会跨行。而使用re.S参数以后,正则表达式会将这个字符串作为一个整体, 260 # 将\n当做一个普通的字符加入到这个字符串中,在整体中进行匹配;re.I:忽略大小写。 261 # 262 # 下面给出了具体的使用示例: 263 # 264 # import re 265 # string = 'o1n27m3k486' 266 # pattern = r'[1-9]+' 267 # print(re.findall(pattern, string)) 268 # 执行结果: 269 # 270 # ['1', '27', '3', '486'] 271 # 函数re.search() 272 # 参数与re.findall()的参数意义相同。re.search 函数会在字符串内查找模式匹配,只要找到第一个匹配然后返回 MatchObject 对象, 273 # 如果字符串没有匹配,则返回 None。 274 # 下面给出了具体的使用示例: 275 # 276 # # coding=utf-8 277 # import re 278 # string = 'o1n27m3k486' 279 # pattern = r'[1-9]+' 280 # print(re.search(pattern, string).group()) # search返回的是对象,用group函数可以显示匹配到的内容 281 # 执行结果: 282 # 283 # 1 284 # 函数re.compile() 285 # 编译正则表达式模式,返回一个对象的模式。(可以把那些常用的正则表达式编译成正则表达式对象,这样可以提高一点效率。) 286 # 参数与re.findall()、re.search()的参数意义相同。 287 # 下面给出了具体的使用示例: 288 # 289 # # coding=utf-8 290 # import re 291 # string = 'o1n27m3k486' 292 # pattern = r'[1-9]+' 293 # obj = re.compile(pattern) 294 # print(obj.findall(string)) 295 # 执行结果: 296 # 297 # ['1', '27', '3', '486'] 298 # ===================================================# =================================================== 299 # ===================================================# =================================================== 300 # ===================================================# ===================================================
#+=#+=#+=#+=#+=#+=#+=#+=#+=#+=#+=#+=#+=#+=#+=#+=#+=#+=#+=#+=#+=#+=#+=#+=#+=#+=#+=
本文来自博客园,作者:凡是过去,皆为序曲,转载请注明原文链接:https://www.cnblogs.com/longhai3/p/15887902.html
如有疑问,欢迎提问
#+=#+=#+=#+=#+=#+=#+=#+=#+=#+=#+=#+=#+=#+=#+=#+=#+=#+=#+=#+=#+=#+=#+=#+=#+=#+=#+=