爬虫案例汇总

爬虫案例汇总

  • 爬取天气数据
  • 百度翻译
  • 爬取药品许可证
  • 华华手机网
  • 菜场价格爬取
  • 正则获取红牛数据
  • 获取糗事百科图片
  • 爬取优美图库图片
  • 爬梨视频
  • 爬取链家二手房数据
  • 豆瓣数据改进爬取
  • 实战猪八戒网
  • 爬取城市名
  • 爬取贴吧图片
  • 小案例
  • seleuinm模块cookie登录案例
  • 图片验证码思路
  • B战视频案例思路
  • 红薯小说网案例
  • 自动百度登录
  • 京东数据获取
  • 知乎案例

爬取天气数据

思路

1.查看前页面的数据加载方式
2.右键点击查看网页源码
3.ctrl+f搜索框输入查找数据,例如,将数据中任意一个数据输入搜索框。
4.继续验证按f12键查看network,点击XHR查看。

执行代码

# 调用模块
import requests
import json

# 输出你要的月份
mouth=input("输出你要的月份:")
# 发送请求
res=requests.get('http://tianqi.2345.com/Pc/GetHistory?areaInfo%5BareaId%5D=54511&areaInfo%5BareaType%5D=2&date%5Byear%5D=2021&date%5Bmonth%5D='+mouth
                 )

# 将数据用json转义,获取data数据
print(res.json()['data'])

 

百度翻译

思路

1.输入单词时,可发现看页面动态变化,打开网络源码,查询数据,发现不是直接加载
2.使用network查看,动态数据加载,例如:在百度翻译中输入英文

代码

# 调用
import requests
# 请求
res=requests.post('https://fanyi.baidu.com/sug',
                  data={"kw": "b"}
                  )
# 进行json格式转化为对应数据类型输出
# 循环输出结果
for d in res.json().get('data'):
    print(d)

 

爬取药品许可证

思路

1.查看目录数据的加载方式,复制数据,打开网络源码,ctrl+f输入复制数据内容
2.发现是动态加载
3.按f12,通过network查找xhr获取数据的地址和请求方式
4.执行post代码,查看获取数据结果
5.发现list是信息数据结果
6.打开详情页面,验证数据加载方式
7.发现是js动态加载,按f12、通过network查找xhr获取数据的地址和请求方式
8.发现url地址,post请求方式和id号
9.发现id数据与第一次爬取的公司简介里面的id一致
结论:
    循环获取ID号,发送post请求,就可以循环获取每个公司的详情信息

代码

# 调用模块
import requests
# 发送请求
res=requests.post(url="http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsList",
                  data={"on": "true",
"page": 1,
"pageSize": 15,
"productName":"",
"conditionType": 1,
"applyname":"",
"applysn":""})
# 获取信息
list_in=res.json().get("list")
# 循环字典每个键值对
for com_id in list_in:
  # 获取ID
    ID=com_id.get("ID")
  # 执行post请求
    res2=requests.post('http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsById',
                 # 请求题为id  
          data={'id':ID})
  # 输出结果
    print(res2.json())

 

华华手机网

思路

1.在浏览器network选项中,请求体对应的关键字是Form Data
2.获取登陆地址,获取请求体From Data的数据内容
3.发送post请求,输入登录用户信息

代码

# 调用模块requests
import requests

# 发送get请求,data为亲求体,
res=requests.post('http://www.aa7a.cn/user.php',
                  data={
# 用户名
"username": "203432312@qq.com",
# 密码
"password": "*******",
# 验证码
"captcha": "5MU8",
"remember": 1,
"ref": "http://www.aa7a.cn/category-123-b0.html",
# 状态:登陆中
"act": "act_login"
                  }
                  )

# 获取cookie内容
user_cookie=res.cookies.get_dict()

# 使用cookie访问网站
res1= requests.get('http://www.aa7a.cn/',
                   cookies=user_cookie
                   )

# 获取页面信息,该网站登录成功后会显示用户名
if '203432312@qq.com' in res1.text:
    print('登录成功')
else:
    print('登录失败')

  

菜场价格爬取

思路

1.查看页面加载方式,右键网络源代码
2.获取数据不在存在,此网站为js动态请求
3.在network中XHR,查找信息获取URL,确定请求方法
4.获取数据结果,选择需要的数据,发现list是我们需要的数据
5.分析数据,发现ID用于确定具体信息数据,一个组对应一个蔬菜
  结论:
  循环获取信息,发送post请求,就可以循环获取每个蔬菜的详情信息
6.查找目录数据信息与页数对应关系。
9.current参数用于控制页数,可通过for循环获取页数,循环输出个页面的数据
10.查看页面数为181417页设置循环,可以设置循环页数,以免服务器和电脑过载
'''
爬取数据时,最好设置一个时间间隔,避免服务器工作量增大,客服端IP被封
'''

代码

代码
复制代码
# 调用模块
import requests
import json
import os
# 判断是否存在蔬菜文件夹
if not os.path.exists(r'蔬菜'):
    # 创建蔬菜文件
    os.mkdir(r'蔬菜')
# 设置循环值,即页数
vert_page=int(input('请输入开始页码:'))
# 结束页码
end_page=int(input('请输入结束页码:'))
# 判断页码是否符合逻辑
if vert_page >= end_page:
    # 提示信息
    print('结束页码不能小于开始页码')
# 符合逻辑
else:
    # 设置循环
    while vert_page <= end_page:
        # 发送post请求
        res=requests.post("http://www.xinfadi.com.cn/getPriceData.html",
                          # 请求头
                          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"},
                          # 请求体
                          data={"limit": 20,
                                # 页码参数
                                "current": vert_page,
                                "pubDateStartTime":"",
                                "pubDateEndTime":"",
                                "prodPcatid":"",
                                "prodCatid":"",
                                "prodName":""}
                          )
        # 获取一页整体的蔬菜信息
        blist=res.json().get("list")
        # 循环获取每个信息
        for vert_id in blist:
            # 定义对应变量,蔬菜名
            cname=vert_id.get('prodName')
            # 定义对应变量,生产地
            cplace=vert_id.get('place')
            # 定义单位
            cinfo=vert_id.get('unitfo')
            #
            cavPrice=vert_id.get('avgPrice')
            # 获取信息
            print('菜名%s,产地%s,单位%s,品均价%s'%(cname,cplace,cinfo,cavPrice))
            # 见蔬菜信息写入文件
            with open(r'蔬菜\蔬菜%s.txt'%vert_id.get('prodName'), 'w',encoding="utf8") as f:
                # 以json格式,一行行写入
                json.dump(vert_id,f)
        # 增加页码
        vert_page+=1;

 

爬取红牛分公司数据

要求:获取红牛所有分公司详细数据(名称 地址 邮箱 电话)

思路:

1.判断数据加载方式,打开网络源地址,查找数据,发现为直接加载
2.进入network,查找url地址、请求方式或请求头等信息
3.执行代码筛选

执行代码:

# 调用模块
import requests
from bs4 import BeautifulSoup
# 请求数据
res=requests.get('http://www.redbull.com.cn/about/branch')
# 构造解析对象
soup =BeautifulSoup(res.text,'lxml')
# 获取公司名
h2_list=soup.find_all('h2')
# 生成公司名列表
namelist=[title.text for title in h2_list]
# 获取具体地址
p_add=soup.find_all(attrs={'class':'mapIco'})
# 生成地址列表
addr_list = [tag.text for tag in p_add]
# 获取邮箱
p_mail=soup.select('.mailIco')
# 生成邮箱列表
email_list = [tag.text for tag in p_mail]
# 获取电话
p_phone=soup.select('.telIco')
# # 生成电话列表
phone_list = [tag.text for tag in p_phone]
# 循环输出数,以表长为索引值
for i in range(len(h2_list)):
    print('''
    公司名称:%s
    公司地址:%s
    公司邮箱:%s
    公司电话:%s 
    '''%(addr_list[i],addr_list[i], email_list[i], phone_list[i]))

 

正则获取红牛数据

思路

# 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
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')
# print(img_info)
# 循环获取图片信息
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')
# 获取解析对象
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')
    # 发送请求
    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)

 

爬取链家二手房数据

思路

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"
                   }
                   )
print(res.text)
# 字符编码
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')

 

豆瓣数据改进爬取

思路

1.查看数据加载方式
2.查看网络network中的获取信息,得到url、请求头、防爬链
3.查看多页查询的方式,结合网址和请求获取信息观察
4.向网址请求信息,获取数据
5.通过bs4模块或者正则方法查找数据

 代码

# 调用函数
import time

import requests
from openpyxl import Workbook
from bs4 import BeautifulSoup
import re
# 创建对象
wb=Workbook()
# 创建工作簿
wb1=wb.create_sheet('豆瓣250')
# 创建表单
wb1.append(['名称','导演','评分','评分人数','座右铭'])
#获取页数指令
page_num=int(input('要几页:'))
# 循环获取每页信息
for i in range(page_num):
    # 进行赋值
    page_id=i*25
    # print(page_id)
    # 发送请求
    res=requests.get('https://movie.douban.com/top250?start=%s'%page_id,
                     # 加入user—agent和防爬链
                     headers={"referer":"https://movie.douban.com/top250?start=0",
                              "user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.54 Safari/537.36"
                    })
    # 构造计息对象
    soup=BeautifulSoup(res.text,'lxml')
    # 查找信息位置
    film_list=soup.select('ol.grid_view div.item')
    # 循环获取每个电影的信息
    for film_info in film_list:
        # 获取电影名
        filmname=film_info.img.attrs.get('alt')
        # 获取职工成员
        filmmake=film_info.find(name='div',attrs={'class':'bd'}).find(name='p')
        # print(filmmake.text)
        # 获取导演名,有空格的
        makername=re.findall('导演: (.*?) ',filmmake.text)
        # 获取评分
        film_code=film_info.find(name='span',class_='rating_num').text
        # 获取评分人数位置
        code_num=film_info.select('div.star span')
        # 获取评分人数
        code_nonum=code_num[3].text
        # 获取座右铭
        try:
            film_word=film_info.select("p.quote span")[0].text
        # 如果操作错误,赋值为0
        except Exception as f:
            film_word=None
        #申明首行
        rows=1
        # 写入数据
        if rows<=len(film_list):
            # 某行第一列
            wb1.cell(column=1,row=rows,value=filmname)
            # 某行第二列
            wb1.cell(column=2,row=rows,value=str(makername))
            # 某行第三列
            wb1.cell(column=3,row=rows,value=film_code)
            # 某行第四列
            wb1.cell(column=4,row=rows,value=code_nonum)
            # 某行第五列
            wb1.cell(column=5,row=rows,value=film_word)
            # 行数加一
            rows+=1
        # wb1.append([filmname,str(makername),film_code,code_nonum,film_word])
    # 在此是实验一次
    break
    # 停顿一秒
    time.sleep(1)
# 保存文件
wb.save(r'电影.xlsx')

 

实战猪八戒网

思路

1.打开网址,查看数据加载方式
2.发现是直接加载,查看请求方式,可以直接向网址发送请求,获取相关请求体信息
3.获取数据后,选用喜欢的模块来获取相关数据

代码

# 代用模块
import requests
from bs4 import BeautifulSoup
from lxml import etree
# 构造表格对象
wb=Workbook()
# 构造工作簿
wb1=wb.create_sheet('猪八戒',0)
# 创建表头文件
wb1.append(['价格','公司','接单数','详细信息','地址'])
# 发送get请求
res=requests.get('https://shanghai.zbj.com/search/f/?',
                 params={"kw": "python"}
                 )
# 构造对象
zhu_html=etree.HTML(res.text)
# 先查找所有的外部div标签
zhu_div=zhu_html.xpath('/html/body/div[6]/div/div/div[2]/div[5]/div[1]/div')
# 循环获取div
for div in zhu_div:
    # 获取价格
    zhu_price=div.xpath('.//span[@class="price"]/text()')
    # 获取公司名
    zhu_name=div.xpath('./div/div/a[1]/div[1]/p/text()')
    # 获取接单数
    zhu_num =div.xpath('./div/div/a[2]/div[2]/div[1]/span[2]/text()')
    # 获取详细信息
    zhu_info=div.xpath('.//div/a[2]/div[2]/div[2]/p/text()')
    # 获取地址
    zhu_address=div.xpath('./div/div/a/div[1]/div/span/text()')
    # 名字的格式不都一样
    try:
        # 将名字中多余部分去除
        name=zhu_name[1].strip('\\n')
    # 如果发生错误
    except Exception as f:
        # 名字为空
        name=''
    # 名字的格式不都一样,无法获取
    try:
        # 输入信息
        wb1.append([zhu_price[0],name,zhu_num[0],zhu_info[0],zhu_address[0]])
    except Exception as f:
        continue
    # break
# 保存文件
wb.save('猪八戒.xlsx')

 

爬取城市名

目的网址:https://www.aqistudy.cn/historydata/

思路

1,查看详细页面,查看数据加载方式
2,查看network获取url,请求方式获取,请求体信息需要请求值
3,根据网络源码的信息布局获取页面,选择适合的选择器和解析方法

代码

# 调用模块
import requests
from lxml import etree
# 发送请求获取页面数据
res=requests.get('https://www.aqistudy.cn/historydata/',
                 headers={
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.61 Safari/537.36"
                 }
                 )
# 构造对象
city_list= etree.HTML(res.text)
# 获取热门城市
hot_city=city_list.xpath('/html/body/div[3]/div/div[1]/div[1]/div[2]/ul/li/a/text()')
# 获取其他城市
other_city=city_list.xpath('/html/body/div[3]/div/div[1]/div[2]/div[2]/ul/div[2]/li/a/text()')

 

爬取贴吧图片

思路

1.打开页面查看加载方式,发现是动态加载,当前页面的图片为假的
2.但可以获得各个帖子的url地址,打开network查看加载方式,和请求体等信息
3.向地址发送请求,循环获取贴吧地址,贴吧地址不完整,需要拼接
4.进入详细页面,发现图片为直接加载
5.发现帖子的img标签都为class=“BDE_Image”,
6.查看network查看加载方式,和请求体等信息

代码

# 调用模块
import requests
from lxml import etree
import os
import time
# 获取用户想要爬取的贴吧名称
tieba = input('请输入贴吧的名称:').strip()
# 获取页数
page_num=int(input('要多少页:').strip())
# 判断当前贴吧名称是否存在对应的文件夹
if not os.path.exists(tieba):
    # 创建文件
    os.mkdir(tieba)
# 设置默认值
i=0
# 循环获取个页面
while i <=page_num:
    # 页面成50
    now_page=i*50
    # 发送请求
    res = requests.get('https://tieba.baidu.com/f?kw=%s&ie=utf-8&pn=%s'%(tieba,now_page),
                       )
    # 生成对象
    tree = etree.HTML(res.text)
    # 查找链接地址
    a_link_list = tree.xpath('//a[@class="j_th_tit "]/@href')
    base_url = 'https://tieba.baidu.com'
    # 循环获取每一个帖子链接 拼接成完整的地址 再发送请求
    for link in a_link_list:
        # 拼接完整地址
        full_link = base_url + link
        print(full_link)
        # 发送详情页请求获取页面数据
        res1 = requests.get(full_link)
        tree1 = etree.HTML(res1.text)
        # 筛选图片链接
        img_src_list = tree1.xpath('//img[@class="BDE_Image"]/@src')
        # 循环请求每个图片地址
        for img_src in img_src_list:
            print(img_src)
            # 发送请求
            res2 = requests.get(img_src)
            # 拼接路径
            file_path = os.path.join(tieba,img_src[-15:])
            # 打开文件以二进制模式写入
            with open(file_path,'wb') as f:
                # 写入图片
                f.write(res2.content)
        # 暂停一秒
        time.sleep(1)
        # 在此只获取一个图片
        break
    # 页数加一
    i+=1
    # 同上道理怕被封
    break

 

小案例

# 调用模块
from selenium import webdriver
from selenium.webdriver.common.keys import Keys  # 键盘按键操作
import time

# 构造对象
bro = webdriver.Chrome('D:\python3.6.8\Scripts\chromedriver.exe')
# 打开淘宝
bro.get('https://www.taobao.com/')
# 查找搜索框标签
input_tag = bro.find_element_by_id('q')
# 输入文本内容
input_tag.send_keys('iphone手机')
time.sleep(1)
# 点击搜索
input_tag.send_keys(Keys.ENTER)
time.sleep(5)
# 关闭浏览器
bro.close()

 

seleuinm模块cookie登录案例

思路

1,用selenium模块打开网址
2设置时间让用户手动登录
3再用selecuinm获取cookie
4用requests使用cookie去模拟爬取数据

代码

# 调用模块
import requests
from selenium import webdriver
import time
import json

# 定义网络地址
url = 'https://account.cnblogs.com/signin?returnUrl=https%3A%2F%2Fwww.cnblogs.com%2F'
# 常见对象
driver = webdriver.Chrome('D:\python3.6.8\Scripts\chromedriver.exe')
# 访问网页
driver.get(url=url)
# 预留时间让用户输入用户名和密码
time.sleep(30)
# 刷新页面为获取cookie
driver.refresh()
# 获取登录成功之后服务端发返回的cookie数据
c = driver.get_cookies()
# 写入文件保存以备用
with open('xxx.txt', 'w') as f:
    # 以json格式写入
    json.dump(c, f)
# 设施cookies存储变量
cookies={}
# 打开文件
with open('xxx.txt', 'r') as f:
    # 输出数据到di
    di = json.load(f)
# 获取数据,把数据转化为requesrts使用的模式,只有name和value是所需要的
for cookie in di:
    # 数据转化
    cookies[cookie['name']] = cookie['value']
print(cookies)

 

图片验证码思路

思路1:

    图像识别技术
        软件:Tesseract-ocr 
        模块:pytesseract

思路2:

打码平台
    花钱买第三方服务
        先使用代码识别如果不想其实还有一帮员工肉眼识别

思路3:

自己人工识别

 

 

B站视屏案例思路

具体代码网址:

https://www.cnblogs.com/xiaoyuanqujing/articles/12016934.html
https://www.cnblogs.com/xiaoyuanqujing/articles/12014416.html

"""
b站有很视频是一分为二的
    分为视频(只有画面没有声音)和音频(视频配套的声音)
"""

思路

1.获取任意视频地址
2.分析页面,代开network一个为视屏每一个为音频
3.查看数据加载方式,url
4.向url发送请求,用requests获取
5.将数据存储如文件,循环发送请求加载,把数据写入文件即可

 

红素网小说案例

案例网址:https://www.cnblogs.com/xiaoyuanqujing/protected/articles/11868250.html

思路

1.小说详情页面鼠标左右键禁用,但是支持按F12调出控制台
2.小说文字不全是直接加载,查找相关二次请求
3.通过观察请求发现网址和请求体信息的对应关系
4,涉及到数据解密肯定需要写js代码 并且一般都会出现关键字decrypt,在source中点击top右键search in all file,搜索decrypt,可以发现多个数据
5.通过寻找content和data发现关键数据
6.点击内容查看数据,确定所要的内容为之前加密数字
7.获取content的数据和other的数据,得到js代码,这就需要进行专门的数据进行解密
8.只解密content的代码会有确实,也需要other代码
9.创建html文本储存content的js代码和other的js代码

 

自动百度登录

思路

1.获取登录链接,向链接输入指令
2.获取用户和密码输入框的位置,输入信息
3.输入登录信息后,获取登陆键位置,点击登录键,完成登录

代码执行

复制代码
# 调用模块
from selenium import webdriver
from selenium.webdriver.common.keys import Keys  # 键盘按键操作
from selenium.webdriver import ActionChains
import time

# 构造对象
bro = webdriver.Chrome('D:\python3.6.8\Scripts\chromedriver.exe')
# 打开百度登录
bro.get('https://www.baidu.com')
time.sleep(1)
# 查找登录按钮
bro.find_element_by_xpath('//*[@id="s-top-loginbtn"]').click()
time.sleep(1)
# 查找用户名框,输入文本内容
bro.find_element_by_id('TANGRAM__PSP_11__userName').send_keys('11111')
time.sleep(1)
# 查找密码框
bro.find_element_by_id('TANGRAM__PSP_11__password').send_keys('11111')
time.sleep(1)
# 登录键
bro.find_element_by_xpath('//*[@id="TANGRAM__PSP_11__submit"]').click()
time.sleep(1)
# 结束驱动器
bro.quit()

 

京东数据

思路

复制代码
1.使用selenium进入网页找到搜索框标签,输入内容
2.进入商品页面中,先执行滚轮操作,加载所有数据
3.图片数据存在懒加载现象,要进行特俗操作
4.数据爬取,可以通过循环来获取
5.使用selenuim寻找下一页只需要点击按钮即可
    将单页数据代码分装成一个函数 之后可以循环爬取多页
6.数据可持续化,将数据写入表格或文本

代码执行

# 调用模块
from selenium import webdriver
from selenium.webdriver.common.keys import Keys  # 键盘按键操作
import time
from openpyxl import Workbook

# 创建表格对象
wb = Workbook()
# 创建工作簿
wb1=wb.create_sheet('商品',0)
# 插入表头
wb1.append(["商品名","商品价格","商品图片连接","商品链接","店名","店铺链接","销量"])
# 创建对象
bro=webdriver.Chrome("D:\python3.6.8\Scripts\chromedriver.exe")
# 打开京东链接
bro.get('https://www.jd.com/')
# 演示等待
bro.implicitly_wait(10)
# 寻找搜索框ID
input_tag=bro.find_element_by_id('key')
# 输入文本内容
input_tag.send_keys('显卡')
# 设置延迟
time.sleep(0.5)
# 点击搜索
input_tag.send_keys(Keys.ENTER)
# 设置延迟
time.sleep(0.5)
# 滚动加载数据,数据源于网页长度
for i in range(0, 11810, 1000):
    # 执行js语句,实现滚轮滑动
    bro.execute_script('window.scrollTo(0,%s)'%i)
    # 设置延迟,
    time.sleep(0.3)
# 获取所有商品数据
all_thing= bro.find_elements_by_css_selector('li.gl-item')
# 获取具体商品信息
for li in all_thing:
    # 获取图标链接
    img_src=bro.find_element_by_css_selector('div.p-img img').get_attribute('src')
    # img的src属性存在懒加载现象,src没有就在data-lazy—img属性下
    # 如果src不存在
    if not img_src:
        img_src = 'https' + bro.find_element_by_css_selector('div.p-img img').get_attribute('data-lazy-img')
    # 商品名
    thing_name=li.find_element_by_css_selector('div.p-name a em').text
    # 商品价格
    thing_price=li.find_element_by_css_selector('div.p-price strong').text
    # 商品连接
    thing_link=li.find_element_by_css_selector('div.p-name a').get_attribute('href')
    # 销量
    thing_pay=li.find_element_by_css_selector('div.p-commit strong a').text
    # 店名
    shop_name=li.find_element_by_css_selector('div.p-shop span a').text
    # 电商连接
    shop_link=li.find_element_by_css_selector('div.p-shop span a').get_attribute('href')
        wb1.append([thing_name,thing_price,img_src,thing_link,shop_name,shop_link,thing_pay])
    break
wb.save(r'商品.xlsx')

 

知乎登录案例

思路

1.电脑端登录知乎需要用户名与密码
2.人工输入用户信息,并滑动验证码后,查看network,查找请求体获取加密信息
加密的代码关键字:encrypt
解密的代码关键字:decrypt
3.在所network的source的top文件中,搜索所有文件中的encrypt
4.在多条数据中搜索正确的数据获取加密数据
5.在js代码出打断点,运行网页就可以获取加密数据
6.之后将该数据进行解析,并对数据进行分析,处理完之后signature为加密数据,需要模块解密
7.解析出数据后,获取cookie请求头,请求体,发送请求获取数据
posted @ 2021-10-05 17:49  微纯册  阅读(257)  评论(0编辑  收藏  举报