一、确定要爬取的网页
首先选择要爬取的网页,我要爬取的是果壳网,url为:https://www.guokr.com/scientific/
爬取每篇文章的标题、名字、作者、发布时间等信息
二、分析网页
我们每次往下拉的时候都会有源源不断的文章出来,而我们在分析该网页的时候新文章的HTML也是我们往下拉的时候出现的,那么恭喜你了,这个网站的数据放在ajax中了,听到这里就有人觉得麻烦了,以前爬取的数据都是固定的,requests请求后就可以直接分析了,其实ajax并不难,我们只要找到ajax的地址和其中的参数即可,为什么这么说呢?因为每次往下拉的时候,ajax每次会都有固定文章出现,这其中肯定有相对应的参数来控制的,我们只要分析这个ajax的url就好了,把其固定不变的截取下来,而改变的参数则我们来传参
下面这个文件就是我们要找的ajax地址了,点击进去看下
看下我们的headers,分析我们请求的url,然后得出结论
固定的是 https://www.guokr.com/apis/minisite/article.json?
有三个参数,分别是retrieve_type、limit、offset,经过多次对比,发现就是offset一直再改变,所以前面两个参数写死,后面的根据参数来改变,开始的时候有18篇文章,而每次ajax会加载出20篇,所以就可以得到offset的值了
三、 分析出每篇文章的url
我们看到每个ajax中都放了20条数据,数据都在result的东西里面
点开这个result,在最下面找到了我们要的url,这里需要记住最重要的一点,得到的ajax的格式都是json格式的
四、分析每篇文件的url,找到需要的数据的位置
随便点开一篇文章,根据分析,发现所有的数据都放在这个div中,只需得到这个div,然后进一步分析得到里面的数据
五、代码
import requests
from bs4 import BeautifulSoup
# 得到每个offset值
def off_set():
offset = 18
# 先取99个ajax,
for i in range(1,100):
if i == 1:
parse_url(offset)
else:
offset = limit + offset
parse_url(offset)
# 将得到的offset传入
def parse_url(offset):
# 带参传递
data = {
'retrieve_type':'by_subject',
'limit':'20',
'offset':offset
}
# 请求这个ajax地址
response = requests.get(start_ajax,params=data,headers=headers)
# 得到的数据是个json格式,所以用requests自带的json函数来解析它
ajax_data=response.json()
# 解析得到每篇文章的url,因为ajax是个字典格式,而其中result的值却是个列表,所以要用[0]取出
lst=ajax_data['result']
for i in lst:
url = i['url']
print(url)
parse(url)
def parse(url):
html = requests.get(url,headers=headers)
html = html.text
soup = BeautifulSoup(html,'lxml')
data = soup.find_all('div',class_='content-th')
for i in data:
title = i.find_all('a')[0].text
name = i.find_all('h1')[0].text.split()[0]
zuoze = i.find_all('div','content-th-info')[0].find_all('a')[0].text
time = i.find_all('div','content-th-info')[0].find_all('meta')[0]['content']
print('{}\t\t{}\t\t{}\t\t{}'.format(title,name,zuoze,time))
if __name__ == '__main__':
start_ajax = 'https://www.guokr.com/apis/minisite/article.json?'
headers = {
'User-Agent': 'Mozilla/4.0(compatible;MSIE 5.5;Windows NT)', }
# 每个offset都是以18为基数,每次叠加20
limit = 20
off_set()
运行结果:
就这样得到了我们要的结果,当然你要其它数据可以自己写,我只想告诉你们如何去解析ajax文件