php 抓取网页源码(南阳理工学院ACM题目信息获取源码我们知道浏览器查看网页时 )
优采云 发布时间: 2022-03-10 21:05php 抓取网页源码(南阳理工学院ACM题目信息获取源码我们知道浏览器查看网页时
)
南洋理工ACM专题信息
获取源代码
我们知道,浏览器在浏览网页时,首先会向服务器发送一个request请求,服务器会根据request请求做一些处理,生成一个response response返回给浏览器,这个response收录我们需要的网页(或者数据,一般是静态网站或者服务端渲染就是直接返回网页),那么我们只需要模仿浏览器向服务端发送请求下载网页,而然后等待服务器发回响应。
1.引入第三方库
import requests
from bs4 import BeautifulSoup
import csv
from tqdm import tqdm
2.模拟浏览器
Headers = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3741.400 QQBrowser/10.5.3863.400'
3. 爬网
r = requests.get(
f'http://www.51mxd.cn/problemset.php-page={pages}.htm', Headers)
r.raise_for_status()
r.encoding = 'utf-8'
BeautifulSoup 网络分析
在学习了requests,了解了伪装技巧之后,终于可以爬到一些正常的web源码(html文档)了,但这距离最后也是最重要的一步——筛选还差得很远。这个过程就像在沙子里淘金一样。没有合适的筛子,你就会错过有价值的东西,或者做无用的工作来筛选出无用的。
淘金者观察土壤并制作筛子。对应爬虫字段就是观察html,自定义过滤器。这里其实是一个简单的抓取 td 标签
1.初始化
soup = BeautifulSoup(r.text, 'html.parser')
2.抓取节点
td = soup.find_all('td')
subject = []
for t in td:
if t.string is not None:
subject.append(t.string)
if len(subject) == 5:
subjects.append(subject)
subject = []
保存文件
with open('NYOJ_Subjects.csv', 'w', newline='') as file:
fileWriter = csv.writer(file)
fileWriter.writerow(csvHeaders)
fileWriter.writerows(subjects)
完整的源代码
URL链接中.htm前面的数字是相关的,所以可以通过循环爬取多页代码,找到爬取数据的位置,编写代码
import requests
from bs4 import BeautifulSoup
import csv
from tqdm import tqdm
Headers = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3741.400 QQBrowser/10.5.3863.400'
csvHeaders = ['题号', '难度', '标题', '通过率', '通过数/总提交数']
subjects = []
for pages in tqdm(range(1, 11 + 1)):
r = requests.get(
f'http://www.51mxd.cn/problemset.php-page={pages}.htm', Headers)
r.raise_for_status()
r.encoding = 'utf-8'
soup = BeautifulSoup(r.text, 'html.parser')
td = soup.find_all('td')
subject = []
for t in td:
if t.string is not None:
subject.append(t.string)
if len(subject) == 5:
subjects.append(subject)
subject = []
with open('NYOJ_Subjects.csv', 'w', newline='') as file:
fileWriter = csv.writer(file)
fileWriter.writerow(csvHeaders)
fileWriter.writerows(subjects)
运行结果: