本周网络爬虫实验终结

本周网络爬虫实验终结

  • 正则获取红牛数据
  • 获取糗事百科图片
  • 爬取优美图库高清图片
  • 爬取梨视频
  • 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')

返回目录

posted @ 2021-09-26 18:54  微纯册  阅读(60)  评论(0编辑  收藏  举报