通俗解释 : 通过Python(爬虫代码), 下载互联网上的数据到本地, 并且提取出我们需要的信息的过程就是就是爬虫
网络爬虫(又被称为网页蜘蛛,网络机器人,或者经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。二十年前是一种黑客行为
- 分类
- 普通爬虫、多线程爬虫、异布爬虫
- 企业/对大型网站:Scrapy框架、Celery分布式
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 |
100 - 199 | 一般信息100 Continue |
---|---|
200 - 299 | 成功响应201 Created |
300 - 399 | 重定向301 Moved Permanently |
400 - 499 | 客户端错误404 Not Found |
500 - 599 | 服务端错误500 Internal Derver Error |
- 确定需求:需要什么
- 寻找需求:在哪找,什么网站
- 发送请求:网页摆放,链接地址
- 解析数据:提取关键节点数据
- 存储数据:存入数据库/写入文件
系统:Linux/MacOs/windows
版本:Python3.4以上
IDE:Anaconda/Pycharm/Sublime/vscode(看个人喜好)…
GET是默认的HTTP请求方式,用于直接输入网址的方式去访问网页
POST方法主要是向Web服务器提交表单数据,通常表单提交时采用POST方法
GET请求把参数包含在URL中,POST通常通过请求体传递参数
GET相对POST不安全,参数直接暴露在URL上,用来传递敏感信息
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协议的网站就会访问不到http请求是无状态的请求协议,
不会记住用户的状态和信息,
也不清楚你在这之前访问过什么?
因为网站需要记录用户是否登录时,就需要在用户登录后创建一些信息
并且要把这些信息记录在当前用户的浏览器中,记录的内容就是cookie
用户使用当前的这个浏览器继续访问这个服务器时,会主动携带这个网站设置的cookie信息
cookie会在浏览器中记录信息,并且在访问时携带这个信息
1,浏览器更换或删除cookie后,信息丢失
2,cookie在浏览器中记录的信息是不安全的,因为不能记录敏感信息
session是在服务器端进行数据的记录,
并且在给每个用户会生成一个sessionID,
并且把这个sessionID设置在用户的浏览器中,也就是设置为cookie
python -V(显示版本)
python3 -V(安装)
pip install requests(安装。win系统直接pip,多个python版本用pip3)
pip3 show requests(查看安装情况)
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) #响应头信息
- 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 -F (文件名).py
(.*?):( .*)
'$1':'$2',
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的文件夹中
1.找数据——TIOBE排行榜(编程语言流行趋势指标)
2.处理数据——正则表达式
3.爬虫利器——requests
4.绘制——数据可视化
1.找数据——TIOBE排行榜(编程语言流行趋势指标)
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
慢python -m pip install xxx -i https://pypi.tuna.tsinghua.edu.cn/simple
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.数据可视化
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()