python爬虫博客_小一手把手教你python爬虫入门(一)_its666的博客-CSDN博客

小一写代码(一)手把手教你python爬虫入门(含实战源码)

写在前面

理论基础

爬虫实战

1.找到合适的网站

2.尝试直接爬取

3.正式爬取

4.总结

写在前面

本人在学校为了完成一个爬虫作业,故自学了一部分爬虫内容,本文将就围绕爬取山东大学的招生信息来讲解爬虫入门技巧。由于本人能力有限,若有错误恳请各位斧正!

读者要求:有一定的python基础(基本语法)

理论基础

爬虫本身并不神秘,就是一段用以获取互联网上的信息的程序。在网上或取信息叫爬虫就很形象了。爬虫有好几种常用库比如:urllib,urllib3,request,scrapy等。本次实验我采用的是requests库,别的库也可以。

在本次实验中我对url(统一资源定位符),html(超文本标记语言),http(超文本传输协议),开发者系统,json有一定的简单了解。

统一资源定位系统(uniform resource locator;URL)是因特网的万维网服务程序上用于指定信息位置的表示方法。 它最初是由蒂姆·伯纳斯·李发明用来作为万维网的地址。 现在它已经被万维网联盟编制为互联网标准RFC1738。

超文本标记语言是一种用于创建网页的标准标记语言。HTML是一种基础技术,常与CSS、JavaScript一起被众多网站用于设计网页、网页应用程序以及移动应用程序的用户界面。网页浏览器可以读取HTML文件,并将其渲染成可视化网页。HTML描述了一个网站的结构语义随着线索的呈现,使之成为一种标记语言而非编程语言。

超文本传输协议是一种用于分布式、协作式和超媒体信息系统的应用层协议。

开发者模式是chrome的用以查看网站源文件的模式。可以通过在chrome右键->检查进行查询。

爬虫实战

1.找到合适的网站

有些网站不很容易爬取,有些网站会有反爬虫结构,选择合适的网站很重要。当然还是以需求为主导。比如我这次的任务就是爬取山大近三年的录取分数,我就不可能通过别的什么网站了。找到山东大学本科招生网历年分数的url(为方便起见,下文称为连接)历年分数

2.尝试直接爬取

import requests

from bs4 import BeautifulSoup

#山大招生网站的信息

url='http://www.bkzssys.sdu.edu.cn/static/front/sdu/basic/html_web/lnfs.html'

web_data=requests.get(url).text#使用requests读取url内容,以字节形式返回

soup=BeautifulSoup(web_data,'lxml')

soup.find_all('tr')

1

2

3

4

5

6

7

BeautifulSoup是一种用于解析html网站的第三方库

tr是table row的意思,表中一行,但是这次查找完的输出结果是空列表。经查询得知这是异步加载动态网页的问题。不能直接进行爬取。

异步加载在我的简单理解就是,有些按钮在点了之后,链接没有改变但是网页上有一部分内容改变了。比如山大招生网站在点了不同省份,不同年份、科类、类型都会有所不同。但是网站的链接没有改变,故需要别的处理方法。

3.正式爬取

在目标网页上右键->检查(还有别的进入开发者模式的方法,自行查阅)进入开发者模式。会弹出如下界面。

单击上面一栏的Network,之后在网页上任意点击一个按钮,激发响应。得到如下界面:

单击黑框内容出现如下界面:

当当当!这个URL才是我们所需要的而且下面的request method 是post,也要注意!这个界面拖到最底部,如图有from data

四个按钮对应的就是决定当期表格的内容辣!而他们所属的键就是他们前面的四个东西了,这也是我们data中的四个键。

def get_source(url='http://www.bkzssys.sdu.edu.cn/f/ajax_lnfs?ts=1588909808236',province='山西',year='2018',subject='理工',kind='普通类'):

data={'ssmc': province,

'zsnf': year,

'klmc': subject,

'zslx': kind}

response = requests.post(url, data=data)

if(response.json()['state']):

source=response.json()['data']['sszygradeList']

else:

print(f'{year}{province}没有报考山东大学{subject}的{kind}考生')

empty=[]

return empty

return source

1

2

3

4

5

6

7

8

9

10

11

12

13

代码分析:与上文不同的url和多了一个data,并且变成了response.post,这是怎么来的呢?就是我们上面分析的那样,还不明白的同学往上看哦。

若把response.json()输出会得到上图所示的结果是一大堆的键值对。而其中state的值为1表示操作成功,或者说是有数据(我操作的时候发现港澳台没人来山大这里就是0值。)而response.json()[‘data’][‘sszygradeList’]就表示了这个网格中的内容。那么这两个是怎么来的呢?我是通过观察键值对得到的。。。不知道有没有什么别的好办法。

这个最后就可以获得到我们想要的结果了!我们通过更改传入的data数据就可以访问到所有的表格了!

data={'ssmc': '山西',

'zsnf': '2019',

'klmc': '理工',

'zslx': '普通类'}

response = requests.post(url, data=data)

json=response.json()

json

1

2

3

4

5

6

7

这样的结果就是我们想要的爬虫结果了!如下展示一行的内容

{‘sex’: ‘’,

‘campus’: ‘’,

‘nf’: ‘2019’,

‘klmc’: ‘理工’,

‘ssmc’: ‘山西’,

‘zylx’: ‘普通类’,

‘kl’: ‘5’,

‘ssdm’: ‘14’,

‘rs’: 195,

‘zdx’: 507.0,

‘minScore’: 583.0,

‘minOrder’: 6175,

‘avgScore’: 595.4,

‘avgOrder’: 4239,

‘maxScore’: 617.0,

‘maxOrder’: 1797,

‘zycc’: ‘’,

‘fsx’: 507.0,

‘zyOrderByXyZyOrder’: False}],

然后就可以对这样的键值对进行各种我们所需要的处理了!

4.总结

要区分是静态网站还是动态网站,静态网站可以直接通过尝试爬取的方法爬取,动态网站可以同过正式爬取的方法进行爬取。

动态爬取需要通过开发者模式获得那个static的url,获取到data的相关内容,以及操作方式。然后通过这样的函数就可以进行对动态网站的爬取了。

虽然不是很难,但对于纯爬虫小白的我还是搞了小半天,写下来希望能帮助到有需要的人吧。

有问题的话欢迎在评论区讨论鸭。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值