社团课Day1-网络爬虫介绍/Requests库的使用

爬虫

1.什么是爬虫

  • 通俗解释 : 通过Python(爬虫代码), 下载互联网上的数据到本地, 并且提取出我们需要的信息的过程就是就是爬虫

  • 网络爬虫(又被称为网页蜘蛛,网络机器人,或者经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。二十年前是一种黑客行为

  • 分类
  • 普通爬虫、多线程爬虫、异布爬虫
  • 企业/对大型网站:Scrapy框架、Celery分布式

  • 还可以学习到:计算机网络、面向对象
  • Web与HTTP协议介绍
    超文本传输协议(Hypertext Transfer Protocol,简称HTTP)是应用层协议。
    HTTP是一种请求/响应式的协议,即一个客户端与服务器建立连接后,向服务器发送一个请求;
    服务器接到请求后,给予相应的响应信息。
  • 爬虫模拟这个过程
  • 发送HTTP请求
GET 获取资源GET /comments?postld=1 HTTP/1.1
POST POST /创建资源posts HTTP1.1
PUT PUT /更新资源posts HTTP/1.1
DELETE 删除资源DELETE /posts/1 HTTP/1.1
  • 接受HTTP响应
100 - 199 一般信息100 Continue
200 - 299 成功响应201 Created
300 - 399 重定向301 Moved Permanently
400 - 499 客户端错误404 Not Found
500 - 599 服务端错误500 Internal Derver Error
  • 爬虫的流程步骤
  1. 确定需求:需要什么
  2. 寻找需求:在哪找,什么网站
  3. 发送请求:网页摆放,链接地址
  4. 解析数据:提取关键节点数据
  5. 存储数据:存入数据库/写入文件
  • 环境

系统:Linux/MacOs/windows
版本:Python3.4以上
IDE:Anaconda/Pycharm/Sublime/vscode(看个人喜好)…


2. 请求方式:GET&POST(最常用)

  • GET是默认的HTTP请求方式,用于直接输入网址的方式去访问网页

  • POST方法主要是向Web服务器提交表单数据,通常表单提交时采用POST方法

  • GET请求把参数包含在URL中,POST通常通过请求体传递参数

  • GET相对POST不安全,参数直接暴露在URL上,用来传递敏感信息

3. requests使用代理IP

headers = {
 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36'
}

这是其中一种,后面案例也会讲到,上面这个是指我是用Win系统Chrome浏览器的用户,想看其他浏览器或者其他系统也可以百度搜User-Agent

  • 如果不做这一步,浏览器看到的我们是{'User-Agent': 'python-requests/2.22.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive'}就是很明显的一个爬虫,很多有robots协议的网站就会访问不到

4. requests处理cookie信息

什么是cookie?

是什么?有什么作用?

http请求是无状态的请求协议,
不会记住用户的状态和信息,
也不清楚你在这之前访问过什么?

因为网站需要记录用户是否登录时,就需要在用户登录后创建一些信息
并且要把这些信息记录在当前用户的浏览器中,记录的内容就是cookie
用户使用当前的这个浏览器继续访问这个服务器时,会主动携带这个网站设置的cookie信息

cookie会在浏览器中记录信息,并且在访问时携带这个信息
1,浏览器更换或删除cookie后,信息丢失
2,cookie在浏览器中记录的信息是不安全的,因为不能记录敏感信息

session

session是在服务器端进行数据的记录,
并且在给每个用户会生成一个sessionID,
并且把这个sessionID设置在用户的浏览器中,也就是设置为cookie


网络请求Requests

requests库

  • 安装
python -V(显示版本)
python3 -V(安装)
pip install requests(安装。win系统直接pip,多个python版本用pip3)
pip3 show requests(查看安装情况)

查看库信息

  • Python第三方库:https://pypi.org/ (官方文档

实操

1.百度爬虫

python发请求,显示网页源代码

  • 浏览器打开百度www.baidu.com
  • 右键点击检查,或键盘点击F12
  • 点击Network,刷新
    下面的www.baidu.com是发送的请求
  • 右侧是解析库结果
  • Headers里面有General,
    Response Headers是请求头信息
    Request Headers是响应头信息
  • Host请求的主题地址
  • 用户代理,不同机器不同浏览器都是不一样的,可以搜索User-Agent看看
    User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36
import requests
# 定义请求的url
url = 'https://www.baidu.com'
# 发起get请求
res = requests.get(url=url)
# 获取相应结果
print(res)  # 
print(res.content) # b'...' 二进制的文本流
print(res.content.decode('utf-8')) # 把二进制的文本流按照utf8的字符集转换为普通字符串
print(res.text) # 获取响应的内容
print(res.status_code) # 请求状态码 200
print(res.url) # 请求的url地址
print(res.request.headers)# 请求的头信息 
print(res.headers) #响应头信息

2.有道翻译爬虫

  • 先看POST请求
    ajax不刷新就可以得到内容
  • F12-点击Network刷新-输入"你好"
  • XHR-AJAX请求项
  • 输入"你好 世界",Preview中找到你好世界
  • headers-同时出现Response/Request Headers
    URL地址,请求格式是POST,Response里有响应内容是json格式
  • From Data-i是发送的内容,返回的内容格式doctype:json
import requests
# 定义请求的url
url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule'
# 定义请求的参数
data = {
    'i':'你好',
    'doctype':'json'
}
# 发起请求 post
res = requests.post(url,data=data)
# 查看请求结果,
code = res.status_code
print(code)
if code == 200:
    # 解析数据
    # print(res.content)
    # print(res.json())  # 如果返回的是json数据,可以直接解析
    resdata = res.json()
    if resdata['errorCode'] == 0:
        # 请求成功
        print(resdata['translateResult'][0][0]['tgt'])

成功了之后,开始封装

import requests
# 封装翻译的函数
def fanyi(kw):
    # 定义请求的url
    url = "http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule"
    # 定义请求的参数
    data = {"i": kw, "doctype": "json"}
    # 发起请求 post
    res = requests.post(url, data=data)
    # 查看请求结果,
    code = res.status_code
    if code == 200:
        # 解析数据
        # print(res.content)
        # print(res.json())  # 如果返回的是json数据,可以直接解析
        resdata = res.json()
        if resdata["errorCode"] == 0:
            # 请求成功
            print(resdata["translateResult"][0][0]["tgt"])
    else:
        print("翻译请求失败")
vars = """
 ***********************
 ** 欢迎使用py翻译工具 **
 ** 输入需要翻译的内容 **
 ** 输入字母 q 则退出  **
 ***********************
 """
print(vars)
while True:
    # 获取用户的输入内容
    keyword = input("输入需要翻译的内容:")
    # 判断是否需要退出
    if keyword == "q":
        break
    # 调用函数,进行翻译
    fanyi(keyword)

然后就可以输入文字可以利用有道进行翻译,
还可以利用pyinstaller打包成可执行文件来玩
pyinstaller -F (文件名).py

4.下载百度图片

  • F12-Network-XHR-Headers/Preview-(acjson?..最后一项数据)
  • params.append那串数据在Query String Parameters里
    用的时候加上"":"",
    Sublime替换:Find-Replace(Ctrl+H)
    Find: (.*?):( .*)
    Replace:'$1':'$2',
    也可以用Pycharm正则替换(Ctrl+R)
import requests
import os
# 进行数据爬取
def getPages(kw, num):
    # 循环页码数和 请求参数
    params = []
    for i in range(30, 30 * num + 30, 30):
        params.append(
            {
                "tn": "resultjson_com",
                "ipn": " rj",
                "ct": "201326592",
                "is": " ",
                "fp": "result",
                "queryWord": kw,
                "cl": "2",
                "lm": "-1",
                "ie": "utf-8",
                "oe": "utf-8",
                "adpicid": " ",
                "st": "-1",
                "z": " ",
                "ic": " ",
                "hd": " ",
                "latest": " ",
                "copyright": " ",
                "word": kw,
                "s": " ",
                "se": " ",
                "tab": " ",
                "width": " ",
                "height": " ",
                "face": " ",
                "istype": "2",
                "qc": " ",
                "nc": "1",
                "fr": " ",
                "expermode": " ",
                "force": " ",
                "cg": "girl",
                "pn": i,
                "rn": "30",
                "gsm": " ",
                "1575710003840": " ",
            }
        )
    # 请求的url
    url = "https://image.baidu.com/search/acjson"
    # 循环请求
    urls = []
    for i in params:
        # 像每个url发起请求
        res = requests.get(url, params=i)
        # 获取请求的数据,加入urls里面
        urls.append(res.json()["data"])
    return urls

# 下载图片到本地
def downloadImg(datalist, dir):
    # 检测文件夹是否存在
    if not os.path.exists(dir):
        os.mkdir(dir)

    # 循环下载图片数据
    x = 0
    for data in datalist:
        for i in data:
            if i.get("thumbURL") != None:
                print(f'下载图片{i.get("thumbURL")}')
                # 像图片地址发起请求
                imgres = requests.get(i.get("thumbURL"))
                open(f"{dir}/{x}.jpg", "wb").write(imgres.content)
                x += 1

# 获取用户输入信息
keyword = input("请输入搜索图片的关键字:")
# 调用函数,进行数据的爬取,可以指定关键字和下载页数
datalist = getPages(keyword, 2)
# 调用函数,保存数据  ,可以指定要保存的图片路径
downloadImg(datalist, "./imgbaidu")

运行上述代码,你会获得百度图片搜索中你搜索的图片关键字的第二页图片,并保存在名为imgbaidu的文件夹中


4.TIOBE趋势爬虫+可视化

1.找数据——TIOBE排行榜(编程语言流行趋势指标)
2.处理数据——正则表达式
3.爬虫利器——requests
4.绘制——数据可视化

1.找数据——TIOBE排行榜(编程语言流行趋势指标)

  • https://www.tiobe.com/tiobe-index/
  • 右键,检查,找到 network,然后刷新:
  • 因为我们直接在网页中看到了数据,看看主页 tiobe-index/ 中有没有数据:
  • 点击,切换到 Response,因为这种数据往往都会写关键字 Date,直接 ctrl+F,然后输入 Date,找到series:[{name:'C',date:[[Date.UTC(2001,5,30),20.24],.......]}]

2.处理数据——正则表达式

  • 三个指标
  • Programming函数名:‘C’(语言名)——键值
  • Date日期:(2001, 5, 30)
  • DatePer数值/数据:20.24
  • 正则表达(数据清洗)
  • 去掉Date.UTC
  • 取出数据
Programming Date DatePer
C xxxx-xx-xx xx
C xxxx-xx-xx xx
C xxxx-xx-xx xx

3.爬虫利器——requests
把网页上的完整数据爬下来

  • 安装库:
  • 第一种方法:python3 -m install xxx
  • 第二种方法:清华镜像安装:(xxx就是用到的库)
    python -m pip install xxx -i https://pypi.tuna.tsinghua.edu.cn/simple
  • 上面也讲过requests的安装方法
import requests
import re
import os
import csv
url = 'https://www.tiobe.com/tiobe-index/'
headers = {
 'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.113 Safari/537.36'
}
#创建本地文件
f = open('tiobedate.csv', 'w', newline='')
#分类
writer = csv.DictWriter(f, ['Programming','DataPer','Date'])
writer.writeheader()
response = requests.get(url, headers=headers)
html = response.text

#正则清洗数据
result = ''.join(re.findall(r'series: (.*?)\}\);', html, re.DOTALL))
result = re.findall(r'({.*?})', result, re.DOTALL)
for item in result:
 name = ''.join(re.findall(r"{name : '(.*?)'", item, re.DOTALL))
 data = re.findall(r"\[Date.UTC(.*?)\]", item, re.DOTALL)
 for i in data:
  i = i.replace(' ', '')
  i = re.sub(r'[()]', '', i)
  value = i.split(',')[-1]
  time_list = i.split(',')[:3]
  time = ""
  for index, j in enumerate(time_list):
   if index !=0:
    if len(j) == 1:
     j = '0' + j
   if index == 0:
    time += j
   else:
    time += '-' + j
  temp = {
   'Programming': name,
   'DataPer': value,
   'Date': time
  }
  writer.writerow(temp)
#写入本地文件
f.close()

然后你会获得一个名为tiobedate.csv的文件,里面包含各种语言的占比、年份信息

4.数据可视化

  • 安装plotly和Pandas库
  • pip install xxx
  • 使用Pandas来完成数据分析,读取csv成功后
  • 使用Plotly的bar方法绘图
  • Plotly库是运行在JSON格式上的平台,用plot.ly访问这个API
  • Pandas使用其强大的数据结构提供高性数据操作和分析工具,import导入
    可视化
#pandas完成数据分析
#读取csv成功后用plotly的bar方法绘图
import plotly.express as px
import pandas as pd
df = pd.read_csv('tiobedate.csv')
fig = px.bar(df,
             y="Programming",
             x="DataPer",
             animation_frame="Date",
             range_x=[0, df.DataPer.max()],
             orientation='h',
             text='DataPer',
             color="Programming")
#绘制
fig.update_layout(width=666,
                  height=666,
                  xaxis_showgrid=False,
                  yaxis_showgrid=False,
                  showlegend=False)
fig.update_xaxes(title_text= "TIOBE趋势图(From:ZYJ)")
fig.show()

你可能感兴趣的:(寒假爬虫社团课)