爬虫基础篇

HTTP基本原理简介

HTTP是超文本传输协议的缩写
1.用于从WWW服务器传输超文本到本地浏览器的传送协议,它可以使浏览器更加高效,使网络传输减少。
2.它不仅保证计算机正确快速地传输超文本文档,还确定传输文档中的哪一部分,以及哪部分内容首先显示(如文本先于图形)等。
3.HTTP是一个应用层协议,由请求和响应构成,是一个标准的客户端服务器模型

HTTP协议永远都是客户端发起请求,服务器回送响应
我们在浏览器中输入一个URL,回车之后便会在浏览器中观察到页面内容。实际上这个过程是浏览器向网站所在的服务器发送了一个请求,网站服务器收到这个请求后进行处理和解析,然后返回对应的响应,接着传回给浏览器.响应里包含了页面的源代码等内容,浏览器再对其进行解析,便将网页呈现了出来

请求方法
常见的请求方式

  • GET请求:请求的参数会直接包含到URL中
  • POST请求:数据通常以表单的i形式传输,而不会体现在URL中

GET和POST请求方法有如下区别:

  1. GET请求中的参数包含到URL中;而POST请求中的参数在请求体中,不会包含到URL中
  2. GET请求提交的数据最多只有1024字节,而POST方式没有限制

一般来说,登陆时,需要提交用户名和密码,其中包含了敏感信息,使用GET方式密码就会暴露在URL中,造成密码泄露,所以这里最好以POST方式发送
上传文件时,由于文件内容比较大,也会选用POST方式

请求头
Accept:请求报头域,用于指定客户端可接受哪些类型的信息。

Accept-Language:指定客户端可接受的语言类型

Accept-Encoding:指定客户端可接受的内容编码

Host:用于指定请求资源的主机IP和端口号,其内容为请求URL的原始服务器或网关的位置。从HTTP1.1版本开始,请求必须包含此内容

Cookie:这是网站为了辨别用户绘画跟踪而存储在用户本地的数据。它的主要功能是维持当前访问会话。例如:我们输入用户名和密码成功登录某个网站后,服务器会用会话保存登录状态信息,后面我们每次刷新或者请求该站点的其它页面时,会发现都是登录状态,这就是cookie的功劳。cookies里有信息标识了我们所对于的服务器会话,每次浏览器在请求该网站页面时,都会在请求头中加上cookies并将其发送给服务器,服务器通过cookies识别出是我们自己,并且查出当前状态时登录状态,所以返回结果就是登录之后才能看到的网页内容

Refer:此内容用来表示这个请求是从哪个页面发送过来的,服务器可以拿到这一信息并做相应的处理,如做来源统计,防盗链处理等

User-Agent:它是一个特殊的字符串头,可以使服务器识别客户使用的操作系统及版本,浏览器及版本等信息,在做爬虫时加上此信息,可以伪装成浏览器;如果不加很可能被识别出为爬虫

Content-type:也叫互联网媒体类型,它用来表示请求中的媒体类型信息

响应
响应,由服务器返回给客户端可以分为三部分:

  • 响应状态码
  • 响应头
  • 响应体

响应状态码表示服务器的响应状态
如200代表服务器正常响应
404代表页面未找到
500代表服务器内部发生错误

在爬虫中,我们可以根据状态码来判断服务器响应的状态,如状态码为200,则证明成功返回数据,在进行进一步的处理

响应头包含了服务器对请求的应答信息:
Date:标识响应产生的时间

Last-Modified:指定资源的最后修改时间

Content-Encoing:指定响应内容的编码

Server:包含服务器的信息,比如名称,版本号等

Content-Type:文档类型,指定返回的数据类型是什么,如text/html代表返回HTML文档,application/x-javascript则代表JS文件,image/jpeg则代表返回图片

Set-Cookie:设置Cookie.响应中的set-cookie告诉浏览器需要将内容放在Cookies中,下次请求携带Cookies请求

响应体
响应的正文数据都在响应体中,比如请求网页时,它的响应体就是网页的HTML代码;
请求一张图片时,它的响应体就是图片的二进制数据
我们做爬虫请求网页后,要解析的内容就是响应体;
在浏览器开发者工具中点击Priview,就可以看到网页的源代码,也就是响应内容,他是解析的目标
在做爬虫时,我们主要通过响应体得到网页的源代码,json数据等然后从中提取相应的内容

Requests 模块

安装

pip install requests

get()方法
get()方法url参数必须
headers请求头信息,绝大多数情况下是需要使用的,一般user-agent

import requests

headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.84 Safari/537.36'
}
url = 'https://top.baidu.com/board'
params = {
    'platform':'pc',
    'sa':'pcindex_entry'

}
reponse = requests.get(url,params=params,headers=headers)
print(reponse.url)

post()方法
post()方法url参数和data或json参数必须
henders请求头信息,绝大多数情况下是需要使用的一般user-agent

响应
响应的属性:
response.status_code 响应的状态码
response.headers:响应头信息
response.encoding 编码格式信息
response.cookies cookies信息
response.url 响应的url信息
response.text 文本类型,通常是html文本
response.content bytes型也就是二级制数据,如图片/视频/音频等
requests模块中有内置JSON解码器,可以处理JSON数据 =》response.json()

import requests

headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.84 Safari/537.36'
}
url='https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fimg.jj20.com%2Fup%2Fallimg%2F1114%2F113020142315%2F201130142315-1-1200.jpg&refer=http%3A%2F%2Fimg.jj20.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1656293754&t=59a1bd4bfd0c7893fb7030af9522ef46'
reponse = requests.get(url,headers=headers)
print(reponse.content)
with open('pic.jpg','wb') as file:
    file.write(reponse.content)

print('图片下载完成')

BS4模块

安装

pip install beautifulsoup4

简介
beautifulsoup4 是一个可以从HTML,XML文件中提取数据的库

安装解析器

pip install lxml

四大对象
Beautiful,Tag,NavigableString,Comment

  1. BeautifulSoup 对象,整个文档对象。
    表示的是一个文档的全部内容.大部分的时候,可以把它当作全部Tag对象,它支持遍历文档书和搜索文档书中描述的大部分方法
  2. Tag对象,标签对象
    与XML或HTML原生文档中的tag相同。
    tag.name 标签名字
    tag[‘class’] class属性
  3. NavigableString对象,字符串对象
    tage.string
  4. Comment 对象,注释对象
from bs4 import BeautifulSoup
soup = BeautifulSoup(open("index.html")) # 整个文档
tag = soup.p  # 标签对象
tag.string  # 字符串对象
import requests
from bs4 import BeautifulSoup

url = 'http://www.baidu.com'
response = requests.get(url)
response.encoding = 'utf-8'
html_doc = response.text
soup = BeautifulSoup(html_doc,'lxml')
print(soup.title.string)

搜索文档书

  • find
  • find_all
  • select_one
  • select
import requests
from bs4 import BeautifulSoup

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.84 Safari/537.36'
}
url = 'https://movie.douban.com/top250'
response = requests.get(url,headers=headers)
html_doc = response.text
soup = BeautifulSoup(html_doc,'lxml')
#查找单个标签  默认第一个
print(soup.find('em'))
#查找标签  全部
print(soup.find_all('em'))
print('~'*30)
# 获取单个标签 默认获取第一个
print(soup.find('span',{'class':'title'}))
print(soup.find(class_='title'))

在这里插入图片描述


import requests
from bs4 import BeautifulSoup

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.84 Safari/537.36'
}
url = 'https://movie.douban.com/top250'
response = requests.get(url,headers=headers)
html_doc = response.text
soup = BeautifulSoup(html_doc,'lxml')

# 获取全部标签
title_elems = soup.find_all('span',{'class':'title'})
for title in title_elems:
    print(title.string)
    print(30*'-')
肖申克的救赎
------------------------------
 / The Shawshank Redemption
------------------------------
霸王别姬
------------------------------
阿甘正传
------------------------------
 / Forrest Gump
------------------------------
泰坦尼克号
------------------------------
 / Titanic
------------------------------
这个杀手不太冷
------------------------------
 / Léon
------------------------------
美丽人生
------------------------------
 / La vita è bella
------------------------------
千与千寻
------------------------------
 / 千と千尋の神隠し
------------------------------
辛德勒的名单
------------------------------
 / Schindler's List
------------------------------
盗梦空间
------------------------------
 / Inception
------------------------------
忠犬八公的故事
------------------------------
 / Hachi: A Dog's Tale
------------------------------
星际穿越
------------------------------
 / Interstellar
------------------------------
楚门的世界
------------------------------
 / The Truman Show
------------------------------
海上钢琴师
------------------------------
 / La leggenda del pianista sull'oceano
------------------------------
三傻大闹宝莱坞
------------------------------
 / 3 Idiots
------------------------------
机器人总动员
------------------------------
 / WALL·E
------------------------------
放牛班的春天
------------------------------
 / Les choristes
------------------------------
无间道
------------------------------
 / 無間道
------------------------------
疯狂动物城
------------------------------
 / Zootopia
------------------------------
大话西游之大圣娶亲
------------------------------
 / 西遊記大結局之仙履奇緣
------------------------------
熔炉
------------------------------
 / 도가니
------------------------------
控方证人
------------------------------
 / Witness for the Prosecution
------------------------------
教父
------------------------------
 / The Godfather
------------------------------
当幸福来敲门
------------------------------
 / The Pursuit of Happyness
------------------------------
触不可及
------------------------------
 / Intouchables
------------------------------
怦然心动
------------------------------
 / Flipped
------------------------------

Process finished with exit code 0

可以稍微做一下处理把英文名去掉

# 获取全部标签
title_elems = soup.find_all('span',{'class':'title'})
for title in title_elems:
    if '/' in title.string:
        continue
    else:
        print(title.string)
        print(30*'-')


肖申克的救赎
------------------------------
霸王别姬
------------------------------
阿甘正传
------------------------------
泰坦尼克号
------------------------------

select_one

import requests
from bs4 import BeautifulSoup

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.84 Safari/537.36'
}
url = 'https://movie.douban.com/top250'
response = requests.get(url,headers=headers)
html_doc = response.text
soup = BeautifulSoup(html_doc,'lxml')

print(soup.select_one('.title').string)


肖申克的救赎
import requests
from bs4 import BeautifulSoup

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.84 Safari/537.36'
}
url = 'https://movie.douban.com/top250'
response = requests.get(url,headers=headers)
html_doc = response.text
soup = BeautifulSoup(html_doc,'lxml')

# class等于title
print(soup.select_one('.title').string)
# class等于hd 空格表示下一级 a标签下的第一个
print(soup.select_one('.hd a').text)


肖申克的救赎

肖申克的救赎
 / The Shawshank Redemption
 / 月黑高飞()  /  刺激1995()

取出全部

title_elems = soup.select('.title')
for title in title_elems:
    print(title.text)
    print(30*'~')
title_elems = soup.select('.hd a')
for title in title_elems:
    print(title.span.string)
    print(30*'~')

肖申克的救赎
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
霸王别姬
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
阿甘正传
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
泰坦尼克号
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
这个杀手不太冷
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

获取电影链接

import requests
from bs4 import BeautifulSoup

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.84 Safari/537.36'
}
url = 'https://movie.douban.com/top250'
response = requests.get(url,headers=headers)
html_doc = response.text
soup = BeautifulSoup(html_doc,'lxml')

title_elems = soup.select('.hd a')
for title in title_elems:
    print(title.get('href'))
    print(title.span.string)
    print(30*'~')

在这里插入图片描述

openpyxl

openpyxl创建排序sheet

from openpyxl import Workbook

#要操作的excel文件
wb = Workbook()
ws = wb.active

ws1 = wb.create_sheet('学生信息',0)
ws2 = wb.create_sheet('学生成绩',1)

wb.save(r"C:\Users\45563\Desktop\work1.xlsx")

在这里插入图片描述

openpyxl 读取excel数据

from openpyxl import Workbook
import openpyxl
# 加载excel文件
wb = openpyxl.load_workbook(r'C:\Users\45563\Desktop\work1.xlsx')
# 选择sheet表 ['学生信息', '学生成绩', 'Sheet']
print(wb.sheetnames)
# 获取具体的sheet表 获取其对象<Worksheet "学生信息">
ws = wb['学生信息']
print(ws)

# 定位读取某个cell
A1 = ws['A1'].value
print(A1)

# 读取多行或全部
for row in ws.rows:
    data_list = [cell.value for cell in row]
    print(data_list)
# 控制读取的范围  行迭代
for row in ws.iter_rows(min_row=2,min_col=1,max_row=max_row,max_col=max_column):
    data_list = [cell.value for cell in row]
    print(data_list)

# 控制读取的范围  列迭代
for column in ws.iter_cols(min_row=2,min_col=1,max_row=max_row,max_col=max_column):
    data_list = [cell.value for cell in column]
    print(data_list)

openpyxl 写入excel

from openpyxl import Workbook
import openpyxl
# 加载excel文件
wb = Workbook()
ws = wb.active
# 选择sheet表 ['学生信息', '学生成绩', 'Sheet']
print(wb.sheetnames)
# 获取具体的sheet表 获取其对象<Worksheet "学生信息">

# cell写入
# ws.cell(row=5,column=5).value = 'python'
#
# 具体定位
# ws['A1'] = 'A1'
# ws['B1'] = 'B1'
# ws['B3'] = 'B3'
# 追加写入
rows = (
    ('李四','男',12),
    ('王五','男',18),
    ('孙李','男',20)
)
for row in rows:
    ws.append(row)

wb.save(r"C:\Users\45563\Desktop\work1.xlsx")

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

X~~X~~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值