异步加载数据:简单的举个例子,有些网页不需要换页,只要网页上的滚动条滑到最下方,它就会自动加载部分数据,和瀑布流一样,可以持续不断的加载数据 ,这些持续加载的数据就属于异步数据(由js控制,和请求网址的Request不是一起的)。
示例网站的URL:https://knewone.com/things/
首先,使用浏览器工具检查,选择Network下的XHR,然后鼠标往下滑,让网页不断的加载数据,观察XHR的变化,如图。
实际上不难看出,只是在Request URL的末尾加上了页码后缀。
然后检查元素,鼠标继续往下滑,让它加载数据,然后观察网页源代码的变化。
通过观察发现,每次加载数据之后,网页中就会多出几个
class="thing"
的article
标签。然后打开其中的一个article
标签就可以发现我们要爬取的元素。
分析完页面元素之后,下面用代码来实现其中一个页面的爬取。
from bs4 import BeautifulSoup
import requests
url = 'https://knewone.com/things/?page=2'
wb_data = requests.get(url)
soup = BeautifulSoup(wb_data.text,'lxml')
imgs = soup.select('a.cover-inner > img')
titles = soup.select('section.content > h4 > a')
links = soup.select('section.content > h4 > a')
for img,title,link in zip(imgs,titles,links):
data = {
'img':img.get('src'),
'title':title.get('title'),
'link':link.get('href')
}
print(data)
完成之后接下来做多页面的爬取,并且设计一个自控页码的函数,最终代码如下。
from bs4 import BeautifulSoup
import requests
import time
url = 'https://knewone.com/things/?page='
def get_page(url,data=None):
wb_data = requests.get(url)
soup = BeautifulSoup(wb_data.text,'lxml')
imgs = soup.select('a.cover-inner > img')
titles = soup.select('section.content > h4 > a')
links = soup.select('section.content > h4 > a')
if data==None:
for img,title,link in zip(imgs,titles,links):
data = {
'img':img.get('src'),
'title':title.get('title'),
'link':link.get('href')
}
print(data)
def get_more_pages(start,end):
for one in range(start,end):
get_page(url+str(one))
time.sleep(1)
get_more_pages(1,8)