惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

P
Privacy International News Feed
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Jina AI
Jina AI
T
Tailwind CSS Blog
WordPress大学
WordPress大学
Scott Helme
Scott Helme
C
Cybersecurity and Infrastructure Security Agency CISA
博客园 - Franky
C
CERT Recently Published Vulnerability Notes
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
雷峰网
雷峰网
Schneier on Security
Schneier on Security
博客园 - 聂微东
T
Tor Project blog
Hugging Face - Blog
Hugging Face - Blog
博客园 - 司徒正美
AI
AI
T
Troy Hunt's Blog
Security Latest
Security Latest
T
The Blog of Author Tim Ferriss
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
C
Check Point Blog
T
Threat Research - Cisco Blogs
W
WeLiveSecurity
V
Vulnerabilities – Threatpost
Recorded Future
Recorded Future
Recent Commits to openclaw:main
Recent Commits to openclaw:main
Cisco Talos Blog
Cisco Talos Blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
Cloudbric
Cloudbric
J
Java Code Geeks
罗磊的独立博客
C
Cyber Attacks, Cyber Crime and Cyber Security
aimingoo的专栏
aimingoo的专栏
L
LangChain Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
P
Privacy & Cybersecurity Law Blog
Google DeepMind News
Google DeepMind News
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
L
Lohrmann on Cybersecurity
I
InfoQ
MongoDB | Blog
MongoDB | Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
The GitHub Blog
The GitHub Blog
The Hacker News
The Hacker News
H
Help Net Security
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
P
Proofpoint News Feed
N
News and Events Feed by Topic

风萧古道 - 勤学苦练,年复一年

游戏服务器开发经验(五)应对复杂需求 沉浸式体验东汉末年生活 - 《真三国无双 起源》玩后感 怒其不争!致2025年HLTV的Top18-NiKo Linux家用服务器维护指南 游戏服务器开发经验(四)避免写Bug的习惯、技巧和心态 游戏服务器开发经验(三)线上维护 游戏服务器开发经验(二)避免内存泄露 游戏服务器开发经验(一)道具防刷 35岁找不到工作,绝对不会是软件开发人员的结局 用爱发电项目开发两个月的心得体会 以魏延“子午谷奇谋”讨论软件需求可行性问题 MQTT协议中可变长度的具体计算方式(有计算过程解析) 关于游戏服务器配置表功能的探讨 Java并发编程中上锁的几种方式 如何用C++分割一个字符串? CSAPP第二章-信息的表示与处理 我的自我介绍 Windows XP虚拟机中文版无需激活下载 Java TreeSet的一些用法和特性 Linux C++ Socket实战 传统软件服务器与游戏服务器架构区别 独立个人项目开发心得 - 任务切分、挑战性、实用性和半途而废 使用Python实现简单UDP Ping 使用Python开发一个简单的web服务器 Kotlin手动实现一个最简单的哈希表 Kotlin实现二叉堆、大顶堆、优先级队列 搭建Spark实战环境(3台linux虚拟机集群)(一)样板机的搭建 Springboot操作MongoDB,包括增改查及复杂操作 Unison在Linux下的安装与使用 Java实现类似WINSCP访问远程Linux服务器,执行命令、上传文件、下载文件 一个被废弃的项目——自动爬取信息然后发给我自己邮箱上 Python连接MongoDB和Oracle实战 MongoDB常用查询语句 vue和springboot项目部署到Linux服务器 Python的一些用法(可能不定时更新) java正则表达式 - 双反斜杠(\)和Pattern的matches()与find() Vue的路由配置及手动改地址栏为啥又跳转回来?? [JavaScript]JS基础知识 [Mybatis]逆向工程中Select语句查询不出‘TEXT’字段 [编译原理]FIRST、FOLLOW和SELECT [Spring]Spring学习笔记 [算法]分布估计算法 - 一种求解多维背包问题的混合分布估计算法_王凌 [日常]我做独立博客的原因 人间值得 深入理解计算机系统 想想就开心! 最重要的事,只有一件 藏书 被讨厌的勇气 关于 简历 朋友 尊重自己:给予与接收的心灵艺术
简述爬虫对两种网站的不同爬取方式
JonathanLin · 2019-11-15 · via 风萧古道 - 勤学苦练,年复一年

爬虫的目的是采集网站的数据。而网站渲染数据有两种方式。我个人将其称为前端渲染和后端渲染。

前端渲染

前端渲染指的是网页并不直接展示数据,而是在读取完网页之后,再次向服务器请求数据。在得到数据之后再渲染到网页中。

后端渲染

后端渲染指的是服务器收到请求之后,将数据在后端写入网页,然后将带有数据的网页直接展示在浏览器中。

爬取方式

目前我并没有使用scrapy、webmagic等爬虫框架,仅使用python的requests模块,json模块和BeautifulSoup框架。

前端渲染的爬取方式

步骤:使用requests请求数据,再用json.loads()方法将返回的数据解析,最后操作得到的数据对象即可。

我们这里以豆瓣为例。

分析该网页。

爬取的url:

https://movie.douban.com/explore#!type=movie&tag=%E7%83%AD%E9%97%A8&sort=recommend&page_limit=20&page_start=0

将url放进浏览器,先点开F12,然后访问。这里我使用谷歌浏览器

可以看到,红框内的All、XHR、JS等。这是一个筛选框,用来筛选该网页请求的数据。

All代表所有,XHR代表异步请求,JS代表Js文件,Css……

对于前端渲染,必然有异步的过程,所以选择XHR。

通过观察,发现第三行是“选电影”列表的数据。

这时,我们点击Headers,查看其请求的详细信息。 可以看到,这是一个Get请求,在下面的Qurey String Parameters可以看到该请求的参数。

数据对应的网页内容为:

测试这个请求。

浏览器可以发起这个请求得到相应,但我们的代码不一定能做到。有一部分原因是网站开发者本身不希望数据被爬取。所以我们需要测试这个接口。这里推荐Postman,先对接口进行测试,查看是否有些Headers或者参数是不需要的,以简化代码量。

Postman的用法下回分解吧。

编写代码。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2019/11/15 22:11
# @Author  : Johnathan Lin

import requests
import json

if __name__ == '__main__':
    # 请求头,一般写上User-Agent防止爬虫,遇到有验证状态的网站要填写Cookie
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36'
    }
    # 请求Url
    url = 'https://movie.douban.com/j/search_subjects?type=movie&tag=%E7%83%AD%E9%97%A8&sort=recommend&page_limit=20&page_start=0'
    # 发送请求
    request = requests.get(url, headers=headers)
    json_data = str(request.content, encoding='utf-8')
    # 解析数据
    json_data_obj = json.loads(json_data)
    for data in json_data_obj['subjects']:
        print(data['title'])

爬取结果: 这里建议养成写上User-Agent的习惯。

对于Get请求,将数据装在url的“?”后面即可,但对于Post请求,一般建议写在data对象里。

我们以网站http://ent.zdface.com/为例。

F12看到一个异步请求:

注意这里同时有Query String Parameters和Form Data。Query String Parameters是装在url后的参数,而Form Data是POST请求传入的参数。

查看其Preview,发现是某一板块下的数据。

找到网页对应部分内容: 开始爬取,注意这回参数要写进data对象里。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2019/11/15 22:11
# @Author  : Johnathan Lin

import requests
import json


if __name__ == '__main__':
    # 请求头,一般写上User-Agent防止爬虫,遇到有验证状态的网站要填写Cookie
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36'
    }
    # 请求参数
    data = {
        'last': '0',
        'amount': '20'
    }
    # 请求Url
    url = 'http://ent.zdface.com/e/ajax/data.php?classid=12'
    # 发送POST请求
    request = requests.post(url, data=data, headers=headers)
    json_data = str(request.content, encoding='utf-8')
    # 解析数据
    json_data_obj = json.loads(json_data)
    for data in json_data_obj:
        print(data['title'])

爬取结果:

后端渲染:

后端渲染网站的爬取过程依旧是发起请求->解析。

这里使用BeautifulSoup解析。

这个框架本身并不难。不需要看什么教程,仔仔细细把官方的中文文档读一遍下来,就知道怎么用了。

文档地址:https://www.crummy.com/software/BeautifulSoup/bs4/doc.zh/

我选择我自己的网站作为后端渲染的网页爬取样例。

我 爬 我 自 己

这是之前用wordpress的时候写的文章,目前可能不适用了。

目标url:www.windypath.com

F12看一下。

一般来说,后端渲染的网站,只要挑第一个看就可以了。而如果你点XHR,将什么都看不到。

这是一个Get请求。点击Response:

可以看到,每一篇文章都是用

标签展示的,其中里面在

下的标签装着标题内容,标签的href就是文章的url。

也就是说,我们要获取文章列表url,可以通过

标签找到标题的标签。

BeautifuSoup功能虽强大,但它提供的一些find(),findAll()并不实用,直接实用select()方法,参数为CSS选择器的字符串,像操控CSS选择元素一样找到元素,是比较灵活方便有效的方式。

注:BeautifulSoup支持许多解析器,用来解析html文档,这里我只用过lxml,记得装bs4的时候也要装lxml。

于是我们写成以下代码:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2019/11/15 22:11
# @Author  : Johnathan Lin

import requests
import json
from bs4 import BeautifulSoup

if __name__ == '__main__':
    # 请求头,一般写上User-Agent防止爬虫,遇到有验证状态的网站要填写Cookie
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36'
    }
    # 请求Url
    url = 'http://www.windypath.com/'
    # 发送请求
    request = requests.get(url, headers=headers)
    html = str(request.content, encoding='utf-8')
    # 解析数据
    html_content = BeautifulSoup(html, 'lxml')
    for article in html_content.select('article'):
        a_tag = article.select('header > h1 > a')[0]
        print('文章标题:' + a_tag.get_text().strip() + ',文章url:' + a_tag['href'])

输出结果: