210301课 初识爬虫
爬虫:开公开页面的信息并迅速提取出来
步骤:
1,获取网页源代码:
HTML
数据放在标签里面
打开目标网页>鼠标右键查看网页源代码(ctrl+u)
2,解析HTML页面
方法:
-
正则表达式
-
Xpath
-
CSS选择器
3,数据持久化
1)可以存储的位置:
- 文本文件(CVS)
- Excel
- 数据库
爬虫程序是法律灰色地带
如果被目标网站举证你有破坏别人动产行为,会产生法律问题
2) robots.txt 准入标识符:
Disallow不许爬的内容,
allow允许爬的类容
**隐匿身份:**让目标网站认为自己是来自网站的正常请求
4,爬虫分类
1)通用爬虫 :爬所有信息
2)定向爬虫 :只关注某一类数据
HTML超文本标签语言
head 网络页面的头部
body 网络页面的正文
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Smts6Q10-1614597745283)(C:\Users\Administrator\Desktop\QQ图片20210301103456.jpg)]
浏览器就是HTML语言的解释器,它能够执行HTML书写的代码
HTML页面最核心的就是标签,除了标签之外,还有CSS和JavaScript
HTML=Tag标签+CSS层叠样式表+JavaScript(JS)页面交互式行为
Tag > 数据content
CSS > 显示display 选择器
JS > 行为behavior 一段代码
练习:编辑一个自己的页面
先下载一个VSCodeUserSetu环境
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lbrbuLxK-1614597745286)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210301165425440.png)]
pycharm里面的存储地址设置
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xKQBIGRW-1614597745288)(C:\Users\Administrator\Desktop\QQ图片20210301152514.jpg)]
5,URI >统一资源标识符
URI包括:URL和URN
URL > 网址 > Uniform Resource Locator统一资源定位符
URN >网络资源唯一标识
完整的URL构成:
https://username:password@www.sohu.com:443/path1/path2/index.html
https: >协议
username: >用户名
password@ >口令
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uHNhLpAr-1614597745291)(C:\Users\Administrator\Desktop\QQ图片20210301152538.jpg)]
6,HTTP协议
HTTP >超文本传输协议
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dSenjLhL-1614597745294)(C:\Users\Administrator\Desktop\QQ图片20210301152546.jpg)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nQxjg7ca-1614597745297)(C:\Users\Administrator\Desktop\QQ图片20210301152554.jpg)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vswhIeUe-1614597745298)(C:\Users\Administrator\Desktop\QQ图片20210301152603.jpg)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fySnMrW6-1614597745299)(C:\Users\Administrator\Desktop\QQ图片20210301152619.jpg)]
网页菜单 >
请求:
–请求行:请求方式 请求路径 协议版本
–请求头:键值对
Host 请求的主机
Accept 接受的内容类型
User-Agent 操作系统和浏览器平台
如果爬虫要伪装成浏览器,就要修改对应的值
Accept-Language 浏览器的语言设定
Accept-Encoding 解码和压缩方式
–空行
–消息体
响应:
–响应行:协议版本 响应状态码
2开头:成功
3开头:重新请求
4开头:请求有问题
5开头:服务器有问题
–响应头:键值对
–空行
–消息体:服务器给浏览器的内容
如果请求的是代码,消息体里面就是HTML代码
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-09kucjFT-1614597745300)(C:\Users\Administrator\Desktop\QQ图片20210301150850.jpg)]
在响应行里常见的状态码所表达的意义:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Xf0XCqyd-1614597745302)(C:\Users\Administrator\Desktop\QQ图片20210301151946.jpg)]
例1: 获取搜狐首页的HTML代码
三方库名称:
requests > 基于HTTP(S)协议联网的三方库
pip config set global.ind
ex-url https://pypi.doubanio.com/simple
pip install requests
import requests
resp = requests.get('http://www.sohu.com/')
print(type(resp))
print(resp.text)
例2:获取百度首页HTML代码
字符和字节之间的转换
str 字符串 encode()
bytes 字节串 decode()
import requests
resp = requests.get('http://www.baidu.com/')
print(type(resp))
# print(resp.text) 默认显示字符串,会显示乱码,需要解码
print(resp.content.decode('utf-8'))
例3:获取百度logo图片
import requests
resp=requests.get('https://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png')
with open('baidu_logo.png', 'wb') as file:
file.write(resp.content)
例4:获取豆瓣电影首页代码
'''
import requests
resp = requests.get('https://movie.douban.com/')
print(type(resp), resp.status_code)
print(resp.text)
'''
# 返回418 说明爬虫被豆瓣发现了
# 需要伪装成浏览器地址爬虫
import requests
resp = requests.get(
url='https://movie.douban.com/top250',
headers={
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.190 Safari/537.36'
}
)
print(resp.status_code)
print(resp.text)
例5:提取豆瓣电影top250
import re
import requests
import random
import time
pattern = re.compile(r'\<span class="title"\>(.+?)\</span\>')
for page in range(10):
resp = requests.get(
url='https://movie.douban.com/top250',
headers={
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64)'
' AppleWebKit/537.36 (KHTML, like Gecko)'
' Chrome/88.0.4324.190 Safari/537.36'
}
)
print(resp.status_code)
movie_titles = pattern.findall(resp.text)
for title in movie_titles:
print(title)
time.sleep(random.randint(3, 5))
# 爬虫时要设置时间间歇,防止封号
afari/537.36'
}
)
print(resp.status_code)
movie_titles = pattern.findall(resp.text)
for title in movie_titles:
print(title)
time.sleep(random.randint(3, 5))
# 爬虫时要设置时间间歇,防止封号