本周网络爬虫实验终结
本周网络爬虫实验终结
- 正则获取红牛数据
- 获取糗事百科图片
- 爬取优美图库高清图片
- 爬取梨视频
- openpyxl的相关知识和使用
- 爬取链家二手房数据
思路
# 1.判断数据加载方式,打开网络源地址,查找数据,发现为直接加载 # 2.进入network,查找url地址、请求方式或请求头等信息 # 3.执行代码筛选
代码
# 调用模块 import requests import json import re # 请求数据 res=requests.get('http://www.redbull.com.cn/about/branch') res_text=res.text # 获取公司名,去除多余符号 h2_list=re.findall('<h2>(.*?)<',res_text) # 获取具体地址,去除多余符号 p_add=re.findall("mapIco'>(.*?)<",res_text) # 获取邮箱,去除多余符号 p_mail=re.findall("mailIco'>(.*?)<",res_text) # 获取电话,去除多余符号 p_phone=re.findall("telIco'>(.*?)<",res_text) # 拉链方法,生成一个迭代器 res2=zip(h2_list,p_add,p_mail,p_phone) # 循环输出迭代器 for i in res2: # 输出结果 print(i)
获取糗图百科图片
思路
1.查看图片加载方式,发现为直接加载
2.所以判断:可以直接向本网页发送get请求,获取数据信息
3.打开network查看url地址,请求方式 4.循环获取每个图片的url地址 5.像图片地址发送请求,获取图片信息后写入文件
代码
# 调用模块 import requests from bs4 import BeautifulSoup import os # 判断是否存在蔬菜文件夹 if not os.path.exists(r'图片'): # 创建蔬菜文件 os.mkdir(r'图片') img_page=input('亲输入你要的页面:') # 发送请求 res=requests.get(url='https://www.qiushibaike.com/imgrank/page/%s'%img_page) # 构造解析对象 soup=BeautifulSoup(res.text,'lxml') # 获取图片 img_info=soup.select('img.illustration') # 循环获取图片信息 for img in img_info: # 获取图片地址 img_info_src = img.get('src') # 图片地址不完整,所以要整合 img_info_src='https:'+img_info_src # 向图片地址发送请求 res2=requests.get(img_info_src) # 获取图片名,输入图片保存 with open(r'图片\%s.jpg'%img_info_src.rsplit('/')[-1].strip('.jpg'),'wb') as f: # 以二进制格式写入 f.write(res2.content)
爬取
思路
1.打开网址查看数据加载方式,方法是打开网络源码查看数据是否存在
2.存在为直接加载,不存在为js动态申请,发现数据为js动态加载
3.打开network查看url地址,请求方式
4.获取首页所有详细页面地址后,执行循环向详细页面地址发送请求
5.进入详细页面时,查看图片加载方式
6.network查看url地址,请求方式,请求体或请求头文件
7.期间还需要观察数据之间的联系,为了方便索引取值
8.向图片地址发送请求获取图片信息
代码
# 调用模块 import requests import os from bs4 import BeautifulSoup # 判断文件是否存在 if not os.path.exists(r'高清'): os.mkdir(r'高清') # 发送请求 res=requests.get('https://www.umei.cc/meinvtupian/rentiyishu/index.htm') 复制代码 # 调用模块 import requests import os from bs4 import BeautifulSoup # 判断文件是否存在 if not os.path.exists(r'高清'): os.mkdir(r'高清') # 发送请求 res=requests.get('https://www.umei.cc/meinvtupian/rentiyishu/index.htm') # 获取解析对象 soup=BeautifulSoup(res.text,'lxml') # 获取各个图片详细页面 img_info=soup.select('.TypeList .TypeBigPics') # 循环取值 for a in img_info: # 获取地址 img_href=a.get('href') print(img_href) # 使地址完整 img_href="https://www.umei.cc/"+img_href res2=requests.get(img_href) # 定义解析对象 soup2=BeautifulSoup(res2.text,'lxml') # 获取class为.imageBody标签的子img标签 img_src=soup2.select('.ImageBody img') for img_for_src in img_src: # 获取图片地址 img_src_real=img_for_src.get('src') # 像地址发送请求 res3=requests.get(img_src_real) # 命名文件,二进制写入,命名规则为网址末尾从右往左 file_path = os.path.join(r'高清',img_src_real[-10:]) # 二进制写入, with open(file_path,'wb') as f: # 将文件写入 f.write(res3.content) print(img_src_real[-10:]+'爬取成功') time.sleep(1)
爬取梨视频
思路
1.打开网址查看数据加载方式,方法是打开网络源码查看视频数据是否存在
2.存在为直接加载,不存在为js动态申请,发现数据为js动态加载
3.打开network查看url地址,请求方式,视频文件多为get请求
4.获取首页所有详细页面地址后,执行循环向详细页面地址发送请求
5.进入详细页面时,查看视频加载方式
6.network查看url地址,请求方式,请求体或请求头文件
systemTime
srcUrl
7.获取信息后,发现不是视频数据
8.再对请求结果的观察中发现真实地址与请求结果地址有相似的地方,但也有不同的地方
9.通过特定的值将请求结果地址替换为真实地址,利用视频ID与systemTIme进行替换,就可以发送求获得视频
10.梨视频存在防爬链,需要在请求返回值中查找referer键值对
11.将referer键值对,作为请求头加入请求
12.向视频的地址发送请求获取视频信息
13.最好设置时间间隔,不要要频繁
代码
# 调用模块 import requests from bs4 import BeautifulSoup import os # 发送get请求网址 res=requests.get('https://www.pearvideo.com/category_9') # 构造解析对象 soup=BeautifulSoup(res.text,'html') # 获取li列表中a链接标签 li_class=soup.select('.categoryem a.vervideo-lilink') # 循环获取视频地址 for a_href in li_class: # 获取网址具体地址 a_list_href=a_href.get('href') # 获取网络ID video_id=a_list_href.split('_')[-1] res2=requests.get('https://www.pearvideo.com/videoStatus.jsp?contId=1742106&mrd=0.5963827104022161', headers={"Referer": "https://www.pearvideo.com/video_1742106"} ) # 发送请求 res2=requests.get('https://www.pearvideo.com/videoStatus.jsp?', # 请求体确定视频 params={"contId": video_id}, # 请求头输入防爬链 headers={"Referer": "https://www.pearvideo.com/video_%s"%video_id}, ) # 因为是json格式,使用json转义对应数据,获取假的视频地址 fake_href=res2.json()["videoInfo"]["videos"]['srcUrl'] # 获取冲突值 systemtime=res2.json()["systemTime"] # 将假地址变成真地址 real_href=fake_href.replace(systemtime,'cont-%s'%video_id) # 发送请求 res4=requests.get(real_href, # 请求体确定视频 params={"contId": video_id}, # 请求头输入防爬链 headers={"Referer": "https://www.pearvideo.com/video_%s" % video_id}, ) # 路径拼接 file_path=os.path.join(r'视频',real_href[-8:]) # 打开路径,以二进制写入 with open(file_path,'wb') as f: # 写入数据 f.write(res4.content) # 提示成功 print("请下载成功") # 等待时间 time.sleep(1)
openpyxl的相关知识和使用
1.excel文件的后缀
03版本之前:.xls
03版本之后:.xlsx
2.pycharm中操作excel的模块
openpyxl模块
该模块可以操作03版本之后的文件
03版本之前兼容性可能不好(不建议使用)
xlrd、wlwt模块
xlrd控制读文件 wlwt控制写文件
上诉模块可以操作任何版本的execl文件
3.excel本质斌不是一个文件
修改execl文件后缀为.zip即可查看,可以看见excel表格也是会从网络获取数据,.xml为网络文件后缀
openpyxl的下载
方法1:
打开DOS界面下载,或pycharm的terminal界面输入
# -i用于换源地址,如果网速快则不用换 pip3 install openpyxl -i 网络地址
方法2:
点击file>>>settings>>>项目名>>>interperter>>>加号>>>输入模块名>>>install
创建文件
''' 执行程序时对象xlsx文件必须关闭,否则报错 '''
调用模块
from openpyxl import Workbook
创建一个对象
wb = Workbook()
保存文件
语法:
# 要在所有该对象的操作程序之后运行,否则操作无效 对象.save(r'名.xlsx')
创建工作簿
语法:
变量名=对象.create_sheet('名字',位置数)
create_sheet方法会返回当前创建的工作簿对象
eg:
wb2.title='4'
修改工作簿名称样式
eg:
# 修改背景颜色 wb2.sheet_properties.tabColor='1072BA'
查看当前excel文件所有的工作簿名称
eg:
# 查看当前excel文件所有的工作簿名称 print(wb.sheetnames)
写入方式1:
eg:
# 创建名为3的工作簿在第一位 wb2=wb.create_sheet('3',0) # 在3工作簿中的1行A列中写入值 wb2['A1']=111
写入方法2:
eg:
# 在3工作簿中的1列3行中写入值 wb2.cell(column=1,row=3,value=333)
写入方法3:
eg:
# 存储一行数据 wb2.append([1,2,3,4,5]) # 插入第二行数据 wb2.append([6,7,8,9,10])
调用读模块
from openpyxl import load_workbook
指定读取表格文件
语法:
变量名 =load_workbook(地址,data_only=True) """ 如果在读取数据的时候不想获取公式本身而是公式的结果需要指定data_only参数 """
指定操作的工作簿
语法:
变量名 = 对象[簿名]
读取数据方式1
# 获取数据和公式或公式 wb3['A3'].value
当没有data_only参数时,输出为公式
读取数据方式2:
# 输出第一行,第二列数据 print(wb1.cell(row=1,column=2).value)
获取最大行数
print(wb1.max_row)
获取最大列数
print(wb1.max_column)
爬取豆瓣网
思路
1.查看数据加载方式 2.查看网络network中的获取信息,得到url、请求头、防爬链 3.查看多页查询的方式,结合网址和请求获取信息观察 4.向网址请求信息,获取数据 5.通过bs4模块或者正则方法查找数据
执行
# 获取体育版梨视频 # 调用模块 import time import requests from bs4 import BeautifulSoup import os # 判断文件是否存在 if not os.path.exists(r'视频'): os.mkdir(r'视频') page_id=int(input('请输入你要的页码:')) page_id=page_id*12 # 发送get请求网址 res=requests.get('https://www.pearvideo.com/category_9', params={"reqType": 5, "categoryId": 9, "start":page_id}) # 构造解析对象 soup=BeautifulSoup(res.text,'lxml') # 获取li列表中a链接标签 li_class=soup.select('.categoryem a.vervideo-lilink') # print(li_class) # 循环获取视频地址 for a_href in li_class: # 获取网址具体地址 a_list_href=a_href.get('href') # 获取网络ID video_id=a_list_href.split('_')[-1] # print(video_id) # 发送请求 res2=requests.get('https://www.pearvideo.com/videoStatus.jsp?', # 请求体确定视频 params={"contId": video_id}, # 请求头输入防爬链 headers={"Referer": "https://www.pearvideo.com/video_%s"%video_id}, ) # 因为是json格式,使用json转义对应数据,获取假的视频地址 fake_href=res2.json()["videoInfo"]["videos"]['srcUrl'] # print(fake_href) # 获取冲突值 systemtime=res2.json()["systemTime"] # 将假地址变成真地址 real_href=fake_href.replace(systemtime,'cont-%s'%video_id) # 发送请求 res4=requests.get(real_href, # 请求体确定视频 params={"contId": video_id}, # 请求头输入防爬链 headers={"Referer": "https://www.pearvideo.com/video_%s" % video_id}, ) # 路径拼接 file_path=os.path.join(r'视频',real_href[-8:]) # 打开路径,以二进制写入 with open(file_path,'wb') as f: # 写入数据 f.write(res4.content) # 提示成功 print("亲下载成功") # 等待时间 time.sleep(1)
爬取链家二手房数据
思路
1.查看数据加载方式, 2.查看网络network中的获取信息,得到url、请求头、防爬链 3.向网页发送请求,获取各详情页的信息
执行
# 调用模块 import requests from bs4 import BeautifulSoup from openpyxl import Workbook # 创建地域字典 where_place={'上海':'sh','北京':'bj','深圳':'sz','武汉':'wh'} # 获取城市名 locale_place=input('哪个城市:') # 判断字典内是否存在 if locale_place not in where_place: print('没有该城市数据') # 城市存在 else: # 获取页数 page_num=input('要几页:') # 发送请求 res=requests.get('https://%s.lianjia.com/ershoufang/https://cs.lianjia.com/ershoufang/pg%s'%(where_place[locale_place],page_num)) # 构造对象 wb = Workbook() # 构造工作簿1 wb1=wb.create_sheet('房子数据',0) # 先定义表头 wb1.append(['房屋名称','小区名称','区域名称','详细信息','关注人数','发布时间', '总价', '单价']) # 创建地域字典 where_place={'上海':'sh','北京':'bj','深圳':'sz','武汉':'wh'} # 获取城市名 locale_place=input('哪个城市:') # 判断字典内是否存在 if locale_place not in where_place: print('没有该城市数据') # 城市存在 else: # 获取页数 page_num=input('要几页:') # 发送请求 res=requests.get('https://%s.lianjia.com/ershoufang/https://cs.lianjia.com/ershoufang/pg%s'%(where_place[locale_place],page_num)) # 构造对象 soup =BeautifulSoup(res.text,'lxml') # 获取指定li标签信息 li_list=soup.select('ul.sellListContent>li') # 循环获取单个li标签 for li in li_list: # 有些li标签内部是广告不是地址信息 try: # 获取名字 title=li.select('div.title>a')[0].text # 无法获取的情况下 except Exception as f: # 继续 continue # 获取地址 address=li.select('div.positionInfo')[0].text # 进行地址分割 real_add =address.split('-') # 因为有一些地址格式不统一所以要进行不同的处理 if len(real_add) ==2: # 解压赋值 add_name,add_loc=real_add # 格式不同的情况下 else: # 链式赋值结果都相同 add_name=add_loc=real_add # 获取详细信息 house_detail=li.select('div.houseInfo')[0].text # 获取时间,但是时间的文本需要分割 people_num,publish_time = li.select('div.followInfo')[0].text.split('/') # 获取总价 all_price=li.select('div.totalPrice')[0].text # 获取单价 one_price=li.select('div.unitPrice')[0].text # 写入表格 wb1.append([title,add_name,add_loc,house_detail,people_num,all_price,one_price]) # 保存文件 wb=(r'房子数据.xlsx')
爬取汽车之家新闻数据
思想
1.查看数据加载方式, 2.查看网络network中的获取信息,得到url、请求头、防爬链 3.向网页发送请求,获取各详情页的信息
实操
# 调用模块 import requests from bs4 import BeautifulSoup from openpyxl import Workbook # 构造文件对象 wb=Workbook() # 构造工作簿 wb1=wb.create_sheet('汽车') # 创建表头 wb1.append(['标题','链接','图标链接','发布时间','新闻简介']) # 发送请求,需要请求头 res = requests.get('https://www.autohome.com.cn/news/', headers={ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36" } ) # 字符编码GBK res.encoding='gbk' # 构造对象 soup = BeautifulSoup(res.text, 'lxml') # 查找所有的li标签 li_list=soup.select('ul.article>li') # 循环获取li标签 for li in li_list: # 获取详情链接 a_tag=li.find('a') # 判断标签是否有意义 if not a_tag: # 标签不是所要内容时,结束循环 continue # 获取新闻链接 link='https:'+a_tag.get('href') # 获取标题 news_title=li.find('h3') # 判断标签是否有意义 if not news_title: # 标签不是所要内容时,结束循环 continue # 获取标签 news_title=news_title.text # 获取图片链接 img_src=li.find('img') if not img_src: # 标签不是所要内容时,结束循环 continue # 获取图片链接 news_img=img_src.get('src') # 获取发布时间 news_title_time=li.find('span').text # 获取简介 news_detail=li.find('p').text # 获取观看次数 news_watch=li.find('em').text # 获取评论次数 news_resp=li.find('em',attrs={'data-class':'icon12 icon12-infor'}).text # 写入数据 wb1.append([news_title,link,news_img,news_title_time,news_detail,news_watch,news_resp]) # 保存数据 wb.save(r'汽车数据.xlsx')