python爬虫系列之初识爬虫

简介: python爬虫系列之初识爬虫前言我们这里主要是利用requests模块和bs4模块进行简单的爬虫的讲解,让大家可以对爬虫有了初步的认识,我们通过爬几个简单网站,让大家循序渐进的掌握爬虫的基础知识,做网络爬虫还是需要基本的前端的知识的,下面我们进行我们的爬虫讲解在进行实战之前,我们先给大家看下...

python爬虫系列之初识爬虫
前言

我们这里主要是利用requests模块和bs4模块进行简单的爬虫的讲解,让大家可以对爬虫有了初步的认识,我们通过爬几个简单网站,让大家循序渐进的掌握爬虫的基础知识,做网络爬虫还是需要基本的前端的知识的,下面我们进行我们的爬虫讲解

在进行实战之前,我们先给大家看下爬虫的一般讨论,方便大家看懂下面的实例

一、爬汽车之家
汽车之家这个网站没有做任何的防爬虫的限制,所以最适合我们来练手

1、导入我们要用到的模块

1
2
import requests
from bs4 import BeautifulSoup
  

2、利用requests模块伪造浏览器请求

1
2

通过代码伪造浏览器请求

res = requests.get("https://www.autohome.com.cn/news/")
  

3、设置解码的方式,python是utf-8,但是汽车之家是用gbk编码的,所以这里要设置一下解码的方式

1
2

设置解码的方式

res.encoding = "gbk"
  

4、把请求返回的对象,传递一个bs4模块,生成一个BeautifulSoup对象

1
soup = BeautifulSoup(res.text,"html.parser")
  

5、这样,我们就可以使用BeautifulSoup给我们提供的方法,如下是查找一个div标签,且这个div标签的id属性为auto-channel-lazyload-atricle

1
2
3

find是找到相匹配的第一个标签

div = soup.find(name="div",attrs={"id":"auto-channel-lazyload-article"})

这个div是一个标签对象

  

6、findall方法,是超找符合条件的所有的标签,下面是在步骤5的div标签内查找所有的li标签

1
li_list = div.find_all(name="li")
  

7、查找li标签中的不同条件的标签

1
2
3
4
5
6
7
8
li_list = div.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、获取标签的属性

1
2
3
4
5
6
7

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方法

1
2
3
4
5
6
7
8
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
2
3
4
5
6

实例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

1
2
print(chouti.cookies.get_dict())

{'gpsd': 'ab141f7a741144216429b6e901da5f34', 'JSESSIONID': 'aaaNxWlWjLLKU9CGXDyNw'}

  

3、转换页面为一个BeautifulSoup对象

1
2
3
4
5
6
7
8
9

将页面转换成一个BeautifulSoup的对象,就可以使用BeautifulSoup的方法了

soup = BeautifulSoup(chouti.text,"html.parser")

news_list = soup.find_all(name="div",attrs={"class":"item"})

for news in news_list:

compont = news.find(name="div",attrs={"class":"part2"})

print(compont.get("share-title"))

 

 

4、下面我们看下如何登陆抽屉

首先我们先通过get方式访问主页

1
2
3
4
5

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方式进行登陆,

1
2
3
4
5
6
7
8
9
10
11
12
13

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()
          )

  

最后登陆成功后,我们来实现一个点赞的操作,这里要注意

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

第二次登陆的时候把第一次返回的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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67

实例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="div",attrs={"class":"item"})

for news in news_list:

compont = news.find(name="div",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
2
3
4
5
6
7
8

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,然后获取到

1
2
3
4
5
6
7
8
9
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

1
2
3
4
5
6
7
8
9
10
11
12

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
               },
                cookies=r2.cookies.get_dict()
              )

  

4、以后就可以携带r3这个请求访问的cookies进行登陆github后的操作了

1
2
3
4
5
6
7
8
9
10
11
obj = BeautifulSoup(r3.text,"html.parser")

print(obj.find_all(name="img",attrs={"alt":"@admin"}))

3、发送get请求,访问这个路径:https://github.com/settings/profile

r4 = requests.get(url="https://github.com/settings/profile",

         cookies=r3.cookies.get_dict()
         )

print(r4.text)
  

爬github的所有的代码如下

四、爬拉钩网
最后我们来爬一下拉勾网

1、首先get方式访问拉勾网的首页

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import requests
from bs4 import BeautifulSoup

如果遇到登陆的密码被加密了有两种解决办法

1、获取他的加密方式,然后手动破解

2、直接抓包把加密后的数据发过去就可以了

1、访问登陆页面

l1 = requests.get(url="https://passport.lagou.com/login/login.html",

              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(l1.text)

  

2、登陆拉钩网,他的请求头稍微有点特殊

data很简单,我们直接抓包就可以拿到

主要是请求头中的数据是怎么来的,下面这2个是在我们请求登陆的页面中返回的,由于这2项在script标签中,我们只能通过正则表达式来匹配获取

最后是爬拉勾网的所有的代码

原文地址https://www.cnblogs.com/bainianminguo/p/10660560.html

相关文章
|
7天前
|
数据采集 存储 数据挖掘
Python网络爬虫实战:抓取并分析网页数据
使用Python的`requests`和`BeautifulSoup`,本文演示了一个简单的网络爬虫,抓取天气网站数据并进行分析。步骤包括发送HTTP请求获取HTML,解析HTML提取温度和湿度信息,以及计算平均温度。注意事项涉及遵守robots.txt、控制请求频率及处理动态内容。此基础爬虫展示了数据自动收集和初步分析的基础流程。【6月更文挑战第14天】
75 9
|
2天前
|
数据采集 存储 JSON
Python网络爬虫教程概览
【6月更文挑战第21天】Python网络爬虫教程概览:安装requests和BeautifulSoup库抓取网页;使用HTTP GET请求获取HTML,解析标题;利用CSS选择器提取数据;处理异步内容可选Selenium;遵循爬虫策略,处理异常,尊重法律与网站规定。
7 1
|
13天前
|
数据采集 存储 中间件
Scrapy,作为一款强大的Python网络爬虫框架,凭借其高效、灵活、易扩展的特性,深受开发者的喜爱
【6月更文挑战第10天】Scrapy是Python的高效爬虫框架,以其异步处理、多线程及中间件机制提升爬取效率。它提供丰富组件和API,支持灵活的数据抓取、清洗、存储,可扩展到各种数据库。通过自定义组件,Scrapy能适应动态网页和应对反爬策略,同时与数据分析库集成进行复杂分析。但需注意遵守法律法规和道德规范,以合法合规的方式进行爬虫开发。随着技术发展,Scrapy在数据收集领域将持续发挥关键作用。
56 4
|
19天前
|
数据采集 JSON API
自动化Reddit图片收集:Python爬虫技巧
自动化Reddit图片收集:Python爬虫技巧
|
26天前
|
数据采集 存储 中间件
Python高效爬虫——scrapy介绍与使用
Scrapy是一个快速且高效的网页抓取框架,用于抓取网站并从中提取结构化数据。它可用于多种用途,从数据挖掘到监控和自动化测试。 相比于自己通过requests等模块开发爬虫,scrapy能极大的提高开发效率,包括且不限于以下原因: 1. 它是一个异步框架,并且能通过配置调节并发量,还可以针对域名或ip进行精准控制 2. 内置了xpath等提取器,方便提取结构化数据 3. 有爬虫中间件和下载中间件,可以轻松地添加、修改或删除请求和响应的处理逻辑,从而增强了框架的可扩展性 4. 通过管道方式存储数据,更加方便快捷的开发各种数据储存方式
|
4天前
|
数据采集 前端开发 JavaScript
Python爬虫技术:动态JavaScript加载音频的解析
Python爬虫技术:动态JavaScript加载音频的解析
|
25天前
|
数据采集 存储 C++
单线程 vs 多进程:Python网络爬虫效率对比
本文探讨了Python网络爬虫中的单线程与多进程应用。单线程爬虫实现简单,但处理速度慢,无法充分利用多核CPU。而多进程爬虫通过并行处理提高效率,更适合现代多核架构。代码示例展示了如何使用代理IP实现单线程和多进程爬虫,显示了多进程在效率上的优势。实际使用时还需考虑代理稳定性和反爬策略。
单线程 vs 多进程:Python网络爬虫效率对比
|
27天前
|
数据采集 前端开发 JavaScript
Python爬虫入门
网络爬虫是自动抓取网页数据的程序,通过URL获取网页源代码并用正则表达式提取所需信息。反爬机制是网站为防止爬取数据设置的障碍,而反反爬是对这些机制的对策。`robots.txt`文件规定了网站可爬取的数据。基础爬虫示例使用Python的`urllib.request`模块。HTTP协议涉及请求和响应,包括状态码、头部和主体。`Requests`模块是Python中常用的HTTP库,能方便地进行GET和POST请求。POST请求常用于隐式提交表单数据,适用于需要发送复杂数据的情况。
26 1
|
1月前
|
数据采集 数据挖掘 Python
使用Python构建简单网页爬虫的技术指南
【5月更文挑战第17天】使用Python构建简单网页爬虫的教程,涉及`requests`和`BeautifulSoup4`库。首先安装所需库,然后发送HTTP GET请求获取HTML内容。利用`BeautifulSoup`解析HTML,找到目标元素,如`<h2>`标签内的新闻标题。处理相对链接,将它们转化为绝对URL。添加异常处理以应对网络问题,同时遵循网站的`robots.txt`规则。此爬虫适用于数据分析和市场研究等场景。
|
16天前
|
数据采集 存储 Web App开发
Python爬虫实战:从入门到精通
Python是开发网络爬虫的首选语言,因其简洁语法和丰富库如requests, BeautifulSoup, Scrapy。爬虫涉及HTTP交互、HTML解析及法律道德问题。以下是爬取豆瓣电影Top250的步骤:确定目标,分析网站,安装必要库(requests, BeautifulSoup),编写代码抓取电影名称、评分和简介,处理异常并优化,如设置请求间隔、使用代理IP和遵循Robots协议。