爬取网站所有页面的url,可通过获取<a>标签里面的href的方式,进行递归操作,从而获取到整个网站的url。拿到url后,可请求该url,根据页面返回的状态码来简单验证页面是否可正常打开。这里需要注意的是,需要将抓取到的url进行重复过滤,避免存入重复的url,导致无限递归。
由于不同网页获取数据的方式不同,有的是静态获取,有的是动态获取,所以需要根据网页的类型,使用不同的方法进行数据的抓取。那么,怎么判断是否是通过ajax获取到的数据呢?可以右键查看网页源代码,在源代码中搜索需要的数据,如果能搜索出来,则是静态获取,如果搜索不出来,那么通常是通过ajax请求获取的数据。
下面通过抓取云课堂的页面url的例子来进行简单地示例:
1、静态页面抓取页面url
不是通过ajax请求获取到的数据的url,都可以通过静态的方式抓取。代码如下:
from lxml import etree
import requests
import os
home_url = "https://study.163.com"
HTTP='https:'
headers = {
'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36',
}
all_urls = []
def get_url(current_url):
urls = []
resp = requests.get(current_url, headers=headers)
status_code = resp.status_code
if status_code != 200:
print("当前页面状态值不等于200!页面url为:%s" %current_url )
with open("error_url.txt",'a+') as fp:
fp.write(str(status_code) + "::")
fp.write(current_url + "\n")
fp.close()
htmlElement = etree.HTML(resp.content.decode('utf-8'))
aList = htmlElement.xpath('//a/@href')
if len(aList) == 0:
print("当前页面未检测到url")
return
for a in aList:
if a.startswith("//study.163.com") or a.startswith("/