这次实战的内容是异步加载:
异步加载和普通的数字下表迭代的URL不同的地方在于不能直接通过一个for循环来获取每一个页面的内容。
如何判别翻页是否是异步加载的呢?打开浏览器检查,然后定位到页面内容的那部分HTML代码,然后在浏览器按下翻页按钮,如果发现HTML代码部分内容闪了一下,那么说明网页是通过异步加载的。
爬取方法:
(以豌豆荚为例, 比如要爬取 http://www.wandoujia.com/category/5029)
通过上面的判断依据,很容易可以发现是异步加载。
1、到浏览器检查中network选项中,筛选出XHR的内容
2、翻页
图中出现的唯一一个文件就是异步加载内容的来源。
这个URL就是我们真正翻出来的页面了,这个是可以在浏览器打开的,不同的网站异步加载的网页是不一样的,所以在解析网页的时候需要根据不同情况来制定不同的处理方案。
由于豌豆荚的反爬虫机制,导致我的爬虫只能爬到前两页的内容,不过没关系,这次的实践主题是应对异步加载,从这个角度看,我还是很出色地完成了。
后来发现了一个网站既是异步加载,又没有很强的反爬虫机制。
就是小米应用商店网页版:http://app.mi.com
这里的话就直接上代码就好了,分析方法都是上面讲过的,页面解析则是前一篇博客有讲到过。
for page in range(0, 10000):
try:
url = url_mi_1 + str(page)+url_mi_2
print(url)
r = requests.get(url, headers=headers)
soup = BeautifulSoup(r.text, 'html.parser')
# print(soup)
pattern = re.compile("displayName\":\"(.*?)\",\"icon\"")
finds = pattern.findall(str(soup))
print(finds)
if len(finds) != 0:
with open("app_mi1.2.txt", 'a', encoding='utf-8')as f:
for find_ in finds:
f.write(find_+'\n')
print("----------page" + str(page) + " done!!----------")
except:
print("----------page" + str(page) + " fail!!----------")
page -= 1
在这里留个小彩蛋,其实这个小米app网站是有个很强的规律,找到这个规律就可以一次性爬完网页上全部的app,如此机智的你能否发现呢?