爬虫简介:
1、什么是互联网?
互联网是由网络设备(网线,路由器,交换机,防火墙等等)和一台台计算机连接而成,像一张网一样。
2、互联网建立的目的?
互联网的核心价值在于数据的共享/传递:数据是存放于一台台计算机上的,而将计算机互联到一起的目的就是为了能够方便彼此之间的数据共享/传递,否则你只能拿U盘去别人的计算机上拷贝数据了。
3、什么是上网?爬虫要做的是什么?
我们所谓的上网便是由用户端计算机发送请求给目标计算机,将目标计算机的数据下载到本地的过程。
只不过,用户获取网络数据的方式是: 浏览器提交请求->下载网页代码->解析/渲染成页面。
而爬虫程序要做的就是: 模拟浏览器发送请求->下载网页代码->只提取有用的数据->存放于数据库或文件中
3.1与3.2的区别在于: 我们的爬虫程序只提取网页代码中对我们有用的数据
4、总结爬虫
爬虫的比喻: 如果我们把互联网比作一张大的蜘蛛网,那一台计算机上的数据便是蜘蛛网上的一个猎物,而爬虫程序就是一只小蜘蛛,沿着蜘蛛网抓取自己想要的猎物/数据 #4.2 爬虫的定义: 向网站发起请求,获取资源后分析并提取有用数据的程序 #4.3 爬虫的价值: 互联网中最有价值的便是数据,比如天猫商城的商品信息,链家网的租房信息,雪球网的证券投资信息等等,这些数据都代表了各个行业的真金白银,可以说,谁掌握了行业内的第一手数据,谁就成了整个行业的主宰,如果把整个互联网的数据比喻为一座宝藏,那我们的爬虫课程就是来教大家如何来高效地挖掘这些宝藏,掌握了爬虫技能,你就成了所有互联网信息公司幕后的老板,换言之,它们都在免费为你提供有价值的数据。
爬虫流程:
1、发起请求
使用http库向目标站点发起请求,即发送一个Request Request包含:请求头、请求体等
2、获取响应内容
如果服务器能正常响应,则会得到一个Response Response包含:html,json,图片,视频等
3、解析内容
解析html数据:正则表达式,第三方解析库如Beautifulsoup,pyquery等 解析json数据:json模块 解析二进制数据:以b的方式写入文件
4、保存数据
数据库
request
请求方式:
常用的请求方式:GET,POST
其他请求方式:HEAD,PUT,DELETE,OPTHONS
ps:用浏览器演示get与post的区别
post请求的参数放在请求体内:可用浏览器查看,存放于form data中
get请求的参数直接放在url后
请求url
url全称统一资源定位符,如一个网页文档,一张图片一个视频都可以用url唯一来确定 url编码:https://www.baidu.com/s?wd=图片 图片将会被编码 网页加载过程:网页的加载一般先加载document文档,在解析document文档的时候,遇到链接则对超链接发起下载图片的请求
请求头
User-agent:告诉它这次请求是浏览器发过来(请求头中如果没有user-agent客户端配置,服务端就将你当做一个非法用户)务必加上
host
cookies:cookie用来保存登录信息
Referer:上一次的跳转路径
一般做爬虫都会加上请求头
请求体
如果是GET方式,请求体没有内容
如果是post,请求体是form data
登录窗口,文件上传等都会被附加到请求体内
登录,输入错误的用户名和密码然后提交,就可以看到post正确等路页面会跳转无法捕捉到post
import requests kwords=input("请输入关键字:>>").strip() response=requests.get( "https://www.baidu.com", params={ "wd":kwards, 'pn':20 }, headers={ "User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.108 Safari/537.36", } ) with open("b.html","w",encoding="utf-8") as f: f.write(response.text)
这段代码可以说是将让脚本去百度搜索用户输入的关键字,然后将百度响应的页面拿到下载文件中
Response
响应状态:
200:代表成功 301:代表跳转 404:表示文件找不到或文件不存在 403:表示没有权限 502:表示服务器错误
Response header:
Location:跳转
set-cookie:可能有多个,是来告诉浏览器,把cookie保存下来
preview就是网页源代码
最主要的部分,包含了请求资源的内容
如网页html,图片
二进制数据等
基本的爬虫示例:
1、爬取汽车之家新闻:
首先我们用requests对汽车之家新闻页面进行爬取,然后将获取到的字符串进行解码,接下来用bs4模块将得到的字符串转成bs.BeautifulSoup类
import requests from bs4 import BeautifulSoup ret= requests.get(url='https://www.autohome.com.cn/news/') # ret.encoding='gbk' ret.encoding=ret.apparent_encoding #页面用什么编码就用什么编码 soup=BeautifulSoup(ret.text,"html.parser") print(soup)
然后用bs.BeautifulSoup的find方法找出想要的东西进行保存
import requests from bs4 import BeautifulSoup ret= requests.get(url='https://www.autohome.com.cn/news/') # ret.encoding='gbk' ret.encoding=ret.apparent_encoding #页面用什么编码就用什么编码 soup=BeautifulSoup(ret.text,"html.parser") print(soup) print(type(soup)) div=soup.find(name="div",id='auto-channel-lazyload-article') #找到id为auto-channel-lazyload-article的div标签 li_list=div.find_all(name='li') #从上面找到的div标签中找所有li标签 for li in li_list: h3=li.find(name='h3') if not h3: continue p=li.find(name='p')#找到每一个li标签中的 a=li.find(name='a')#找li中没一个a标签 img=li.find('img')#找li中每一个img标签 src=img.get('src')#获取img标签的src file_name=src.rsplit('__',maxsplit=1)[1]#将获取的img路径取出__后面的内容作为文件名 ret_img=requests.get( url='https:'+src#爬取所有图片 ) with open(file_name,'wb') as f: f.write(ret_img.content) #最后将文件写在文件中进行保存
成功爬取了汽车之家新闻页的图片
模拟登陆抽屉并点赞