python爬虫经典步骤
详解python爬虫系列之初识爬虫前言
我们这里主要是利用requests模块和bs4模块进行简单的爬虫的讲解,让大家可以对爬虫有了初步的认识,我们通过爬几个简单网站,让大家循序渐进的掌握爬虫的基础知识,做网络爬虫还是需要基本的前端的知识的,下面我们进行我们的爬虫讲解
在进行实战之前,我们先给大家看下爬虫的一般讨论,方便大家看懂下面的实例
一、爬汽车之家
汽车之家这个网站没有做任何的防爬虫的限制,所以最适合我们来练手
1、导入我们要用到的模块
|
import requests from bs4 import beautifulsoup |
2、利用requests模块伪造浏览器请求
|
# 通过代码伪造浏览器请求 res = requests.get(https: / / www.autohome.com.cn / news / ) |
3、设置解码的方式,python是utf-8,但是汽车之家是用gbk编码的,所以这里要设置一下解码的方式
|
# 设置解码的方式 res.encoding = "gbk" |
4、把请求返回的对象,传递一个bs4模块,生成一个beautifulsoup对象
|
soup = beautifulsoup(res.text, "html.parser" ) |
5、这样,我们就可以使用beautifulsoup给我们提供的方法,如下是查找一个li标签,且这个li标签的id属性为auto-channel-lazyload-atricle
|
# find是找到相匹配的第一个标签 li = soup.find(name = "li" ,attrs = { "id" : "auto-channel-lazyload-article" }) # 这个li是一个标签对象 |
6、findall方法,是超找符合条件的所有的标签,下面是在步骤5的li标签内查找所有的li标签
|
li_list = li.find_all(name = "li" ) |
7、查找li标签中的不同条件的标签
|
li_list = li.find_all(name = "li" ) for li in li_list: title = li.find(name = "h3" ) neirong = li.find(name = "p" ) href = li.find(name = "a" ) img = li.find(name = "img" ) if not title: continue |
8、获取标签的属性
|
# print(title, title.text, sep="标题-->") # print(neirong, neirong.text, sep="内容-->") # print(href, href.attrs["href"], sep="超链接-->") # 获取标签对接的属性 # print(img.attrs["src"]) # ret = requests.get(img_src) |
9、如果我们下载一个文件,则需要requests.get这个文件,然后调用这个文件对象的content方法
|
src = img.get( "src" ) img_src = src.lstrip( "/" ) file_name = img_src.split( "/" )[ - 1 ] img_src = "://" .join([ "https" ,img_src]) print (file_name) ret = requests.get(img_src) with open (file_name, "wb" ) as f: f.write(ret.content) |
10、整体的代码如下
二、爬抽屉
这里我们看下如何爬抽屉
1、首先抽屉有做防爬虫的机制,我们在访问的时候必须要加一个请求头
|
# 实例1:爬取数据,这个网址有做防爬虫机制,所以需要带一个请求头信息,才能让服务端以为我们是浏览器,不然服务端会把我们的请求当做爬虫行为进行拦截 # 设置一个请求头 chouti = requests.get(url = "https://dig.chouti.com/" , headers = { "user-agent" : "mozilla/5.0 (windows nt 6.1) applewebkit/537.36 (khtml, like gecko) chrome/57.0.2987.133 safari/537.36" }) |
2、这个请求网站会返回一个cookies,通过下面的方法获取cookies
|
print (chouti.cookies.get_dict()) # {'gpsd': 'ab141f7a741144216429b6e901da5f34', 'jsessionid': 'aaanxwlwjllku9cgxdynw'} |
3、转换页面为一个beautifulsoup对象
|
# 将页面转换成一个beautifulsoup的对象,就可以使用beautifulsoup的方法了 soup = beautifulsoup(chouti.text, "html.parser" ) news_list = soup.find_all(name = "li" ,attrs = { "class" : "item" }) for news in news_list: compont = news.find(name = "li" ,attrs = { "class" : "part2" }) print (compont.get( "share-title" )) |
4、下面我们看下如何登陆抽屉
首先我们先通过get方式访问主页
|
# 1、先查看首页 r1 = requests.get(url = "https://dig.chouti.com/" , headers = { "user-agent" : "mozilla/5.0 (windows nt 6.1) applewebkit/537.36 (khtml, like gecko) chrome/57.0.2987.133 safari/537.36" }) |
然后我们通过post方式进行登陆,
|
# 2、提交用户名和密码进行登陆 r2 = requests.post(url = "https://dig.chouti.com/login" , headers = { "user-agent" : "mozilla/5.0 (windows nt 6.1) applewebkit/537.36 (khtml, like gecko) chrome/57.0.2987.133 safari/537.36" }, data = { "phone" : "86139252938822" , "password" : "admin" , "onemonth" : 1 }, cookies = r1.cookies.get_dict() ) |
最后登陆成功后,我们来实现一个点赞的操作,这里要注意
|
# 第二次登陆的时候把第一次返回的cookies带上,这个是抽屉这个网站的套路,同样这次登陆也会返回一个cookies,但是登陆这次返回的cookies其实是个迷惑我们的cookies,没有用 # print(r2.text) # 登陆失败返回的信息:{"result":{"code":"21101", "message":"手机号或密码错误", "data":{}}} # 登陆成功返回的信息:{"result":{"code":"9999", "message":"", "data":{"complatereg":"0","destjid":"cdu_53218132468"}}} # 如果登陆成功,通过下面的方法就可以把服务端返回的cookies拿到,以后在发请求,带着cookies去就可以了 print (r2.cookies.get_dict()) # {'puid': 'b11ec95d3b515ae2677a01f6abd5b916', 'gpid': '01cff9a184bd427789429d1dd556f4d2'} r3 = requests.post(url = "https://dig.chouti.com/link/vote?linksid=25461201" , headers = { "user-agent" : "mozilla/5.0 (windows nt 6.1) applewebkit/537.36 (khtml, like gecko) chrome/57.0.2987.133 safari/537.36" }, # cookies=r2.cookies.get_dict(), cookies = r1.cookies.get_dict(), # 破解抽屉coookies套路 ) # 这次点赞,我们同样带的cookies是第一次登陆主页返回的cookies,而不是登陆成功后返回的cookies # print(r3.text) |
爬抽屉所有的代码如下
|
# 实例1:爬取数据,这个网址有做防爬虫机制,所以需要带一个请求头信息,才能让服务端以为我们是浏览器,不然服务端会把我们的请求当做爬虫行为进行拦截 # 设置一个请求头 chouti = requests.get(url = "https://dig.chouti.com/" , headers = { "user-agent" : "mozilla/5.0 (windows nt 6.1) applewebkit/537.36 (khtml, like gecko) chrome/57.0.2987.133 safari/537.36" }) # print(chouti.text) print (chouti.cookies.get_dict()) # {'gpsd': 'ab141f7a741144216429b6e901da5f34', 'jsessionid': 'aaanxwlwjllku9cgxdynw'} # 将页面转换成一个beautifulsoup的对象,就可以使用beautifulsoup的方法了 soup = beautifulsoup(chouti.text, "html.parser" ) news_list = soup.find_all(name = "li" ,attrs = { "class" : "item" }) for news in news_list: compont = news.find(name = "li" ,attrs = { "class" : "part2" }) print (compont.get( "share-title" )) # 1、先查看首页 r1 = requests.get(url = "https://dig.chouti.com/" , headers = { "user-agent" : "mozilla/5.0 (windows nt 6.1) applewebkit/537.36 (khtml, like gecko) chrome/57.0.2987.133 safari/537.36" }) # r1.cookies.get_dict(),第一次访问主页,服务端就给返回了一个cookies # 2、提交用户名和密码进行登陆 r2 = requests.post(url = "https://dig.chouti.com/login" , headers = { "user-agent" : "mozilla/5.0 (windows nt 6.1) applewebkit/537.36 (khtml, like gecko) chrome/57.0.2987.133 safari/537.36" }, data = { "phone" : "8613925293887" , "password" : "admin123." , "onemonth" : 1 }, cookies = r1.cookies.get_dict() ) # 第二次登陆的时候把第一次返回的cookies带上,这个是抽屉这个网站的套路,同样这次登陆也会返回一个cookies,但是登陆这次返回的cookies其实是个迷惑我们的cookies,没有用 # print(r2.text) # 登陆失败返回的信息:{"result":{"code":"21101", "message":"手机号或密码错误", "data":{}}} # 登陆成功返回的信息:{"result":{"code":"9999", "message":"", "data":{"complatereg":"0","destjid":"cdu_53218132468"}}} # 如果登陆成功,通过下面的方法就可以把服务端返回的cookies拿到,以后在发请求,带着cookies去就可以了 print (r2.cookies.get_dict()) # {'puid': 'b11ec95d3b515ae2677a01f6abd5b916', 'gpid': '01cff9a184bd427789429d1dd556f4d2'} r3 = requests.post(url = "https://dig.chouti.com/link/vote?linksid=25461201" , headers = { "user-agent" : "mozilla/5.0 (windows nt 6.1) applewebkit/537.36 (khtml, like gecko) chrome/57.0.2987.133 safari/537.36" }, # cookies=r2.cookies.get_dict(), cookies = r1.cookies.get_dict(), # 破解抽屉coookies套路 ) # 这次点赞,我们同样带的cookies是第一次登陆主页返回的cookies,而不是登陆成功后返回的cookies # print(r3.text) |
三、爬github
github的登陆是form表单做的,所以我们在登陆github的时候需要把cookies和crsf_token都带上
1、访问github的首页
|
# 1、get,访问登陆页面 r1 = requests.get(url = "https://github.com/" , headers = { "user-agent" : "mozilla/5.0 (windows nt 6.1) applewebkit/537.36 (khtml, like gecko) chrome/57.0.2987.133 safari/537.36" } ) # print(r1.cookies.get_dict()) |
2、访问登陆页面,需要在隐藏的input标签中找到token,然后获取到
|
r2 = requests.get(url = "https://github.com/login" , headers = { "user-agent" : "mozilla/5.0 (windows nt 6.1) applewebkit/537.36 (khtml, like gecko) chrome/57.0.2987.133 safari/537.36" } ) login_obj = beautifulsoup(r2.text, "html.parser" ) token = login_obj.find(name = "form" ,attrs = { "action" : "/session" }).find(name = "input" ,attrs = { "name" : "authenticity_token" }).get( "value" ) |
3、post方式访问登陆页面,携带上用户名和密码,token和cookies
|
# 2、发送post请求,发送用户名和密码,发送的数据要不仅有用户名和密码,还要带上csrf token和cookie,浏览器发什么,我们就发什么 r3 = requests.post(url = "https://github.com/session" , headers = { "user-agent" : "mozilla/5.0 (windows nt 6.1) applewebkit/537.36 (khtml, like gecko) chrome/57.0.2987.133 safari/537.36" }, data = { "login" : "admin" , "password" : "admin" , "authenticity_token" :token },标签:
|