python爬⾍实验(静态⽹页内容爬取):爬取中国⼯程院⽹站相关信息
实验内容:爬取中国⼯程院⽹页上的院⼠信息,把每位院⼠的简介保存为本地⽂本⽂件,把每位院⼠的照⽚保存为本地图⽚,⽂本⽂件和图⽚⽂件都以院⼠的姓名为主⽂件名。
#-*- codeing = utf-8 -*-
#@Time :2021/5/20 8:54
#@Author :Onion
#@File :Experiment3.py
#@Software :PyCharm
import requests
import re
quest import urlopen
# ⽹站地址
URL ='www.cae/cae/html/main/col48/column_48_1.html'
# 模拟访问,通过来向⽹页发出请求并得到返回结果,返回结果respond变量⾥的text就是Html页⾯
respond = (URL)
)
# 姓名所在的位置:存在于class = name_list的li标签下的a标签中,通过正则表达式来在⽹页的源代码中寻a标签
# 因为⽹页中的包含姓名的a标签不⽌⼀个,因此⽤⼀个list来保存⽹页中包含姓名的a标签
# findall中指定正则表达式作⽤的对象是,寻的内容是上⽂所说的a标签,\d+表⽰匹配后⽅的所有数字
# 通过调试可以发现num_name_list中存放的都是正则表达式\d+匹配到的数字'63775817', '35791989'....
num_name_list = re.findall('<a href="/cae/html/main/colys/(\d+).html" target="_blank">', )
count =1国内源代码网站
# 1:遍历num_name_list列表,2:模拟点击进⼊⼆级页⾯
for people in num_name_list[:len(num_name_list)]:
# 将每个院⼠的姓名的a标签位置对应的正则表达式匹配到的数字和原始链接合成为指定院⼠对应的a标签链接
people_url ='www.cae/cae/html/main/colys/{}.html'.format(people)
# 通过来模拟点击,并且获得请求的respond
people_respond = (people_url)
ding ='utf-8'
# 到简介的位置: class = intro⾥的p标签⾥的内容
# 先到class = intro 的div标签
#(.*?)表⽰匹配任意字符到下⼀个符合条件的字符
# 例⼦:正则表达式a. *?xxx
# 可以匹配
# abxxx
# axxxxx
# abbbbbxxx
# re.S的作⽤的 . 表⽰可以对指定的字符串做跨⾏的匹配,如果不⽤re.S,则只能在中做单⾏匹配
text1 = re.findall('<div class="intro">(.*?)</div>',,re.S)
# 观察html页⾯可以看到<p>标签中有⼀些其余的内容 &ensp;之类的,需要把这些字符串剔除,并提取出剔除后的内容
# sub函数中r的作⽤:应该将r与字符串放在⼀起。
# 前缀r是字符串语法的⼀部分。使⽤r,Python不会解释引号中的反斜杠序列,如\n、\t等。如果没有r,则必须键⼊每个反斜杠两次才能将其传递给re.sub。# r'\]\n'
# 以及
# '\\]\\n'
# 是两种编写同⼀字符串的⽅法。
# re.sub函数解析:
# ⽅法中含有5个参数,下⾯进⾏⼀⼀说明(加粗的为必须参数):
# (1)pattern:该参数表⽰正则中的模式字符串;
# (2)repl:该参数表⽰要替换的字符串(即匹配到pattern后替换为repl),也可以是个函数;
# (3)string:该参数表⽰要被处理(查替换)的原始字符串;
# (4)count:可选参数,表⽰是要替换的最⼤次数,⽽且必须是⾮负整数,该参数默认为0,即所有的匹配都会被替换;
# (5)flags:可选参数,表⽰编译时⽤的匹配模式(如忽略⼤⼩写、多⾏模式等),数字形式,默认为0。
text2 = re.sub(r'<p>| | |</p>','', text1[0]).strip()# 使⽤r,将不会解析\n,\t,<p>| | |</p>是要被替换的字符串,''是要替换成的字符串,text [0]是原始字符串,strip()⽅法去除字符串前⾯和后⾯的所有设置的字符串\n \t等等,默认为空格
# 将简介信息保存在本地⽂件中,题⽬意思是要求⽂件名和⼈名⼀致,因此通过正则表达式获取⼈名,因为返回的是⼀个list,为了以防获取到多个值,取[0]下标的元素作为file_name
file_name = re.findall('<div class="right_md_name">(.*?)</div>',)[0]
# 保存信息
with open(file_name+'.txt',mode='a+',encoding='utf-8')as file:
file.write('{}. '.format(count)+ text2 +'\n')
count +=1
# re.I
# 使匹配对⼤⼩写不敏感
# re.L
# 做本地化识别(locale - aware)匹配
# re.M
# 多⾏匹配,影响 ^ 和 $
# re.S
# 使.匹配包括换⾏在内的所有字符
# re.U
# 根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B.
# re.X
# 获取图⽚信息xxxxxxxxxxx.jpg
image = re.findall(r'<img src="/cae/admin/upload/img/(.+)" style=', , re.I)
if image:
# 图⽚的http地址
image_URL = r'www.cae/cae/admin/upload/img/{0}'.format(image[0].replace(' ', r'%20'))
# 图⽚名
image_Name = re.findall('<div class="right_md_name">(.*?)</div>',)[0]
with open(image_Name+'.jpg',mode='wb')as imagefile:
# 把链接上的图⽚先读取出来,然后写⼊本地
imagefile.write(urlopen(image_URL).read())
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论