python爬虫: 爬一个英语学习网站

article/2025/10/13 1:10:50

爬虫的基本概念


关于爬虫的基本概念, 推荐博客https://xlzd.me/ 里面关于爬虫的介绍非常通俗易懂.
简单地说,在我们输入网址后到可以浏览网页,中间浏览器做了很多工作, 这里面涉及到两个概念:

  • IP地址: IP地址是你在网络上的地址,大部分情况下它的表示是一串类似于192.168.1.1的数字串。访问网址的时候,事实上就是向这个IP地址请求了一堆数据。
  • DNS服务器: 而DNS服务器则是记录IP到域名映射关系的服务器,爬虫在很大层次上不关系这一步的过程。一般浏览器并不会直接向DNS服务器查询的IP,这个过程要复杂的多,包括向浏览器自己、hosts文件等很多地方先查找一次,上面的说法只是一个统称。
    浏览器得到IP地址之后,浏览器就会向这个地址发送一个HTTP请求。然后从网站的服务器端请求到了首页的HTML源码,然后通过浏览器引擎解析源码,再次向服务器发请求得到里面引用过的Javascript、CSS、图片等资源,得到了网页浏览时的样子。

搭建实验环境

import requests # 网页下载工具
from bs4 import BeautifulSoup # 分析网页数据的工具
import re # 正则表达式,用于数据清洗\整理等工作
import os # 系统模块,用于创建结果文件保存等
import codecs # 用于创建结果文件并写入

2 爬虫的实现
编写爬虫之前,我们需要先思考爬虫需要干什么、目标网站有什么特点,以及根据目标网站的数据量和数据特点选择合适的架构。
推荐使用Chrome的开发者工具来观察网页结构。对应的快捷键是"F12"。
右键选择检查(inspect)即可查看选中条目的HTML结构。

一般,浏览器在向服务器发送请求的时候,会有一个请求头——User-Agent,它用来标识浏览器的类型.
如果是python代码直接爬,发送默认的User-Agent是python-requests/[版本号数字]
这时可能会请求失败,因为服务器会设置通过校验请求的U-A来识别爬虫,通过模拟浏览器的U-A,能够很轻松地绕过这个问题。
设置Use-Agent请求头, 在代码'User-Agent':后就是虚拟的浏览器请求头.

def fetch_html(url_link):html = requests.get(url_link, headers={'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.80 Safari/537.36'}).content
return htmlDOWNLOAD_URL = 'http://usefulenglish.ru/phrases/'
html = fetch_html(DOWNLOAD_URL)

上面这段代码可以将url_link中网址的页面信息全部下载到变量html中.
之后调用Beautifulsoup解析html中的数据.

#!/usr/bin/python
# -*- coding: utf-8 -*-
from bs4 import BeautifulSoup
html_doc = """
<html><head><title>The Dormouse's story</title></head>
<body>
<p class="title"><b>The Dormouse's story</b></p>
<p class="story">Once upon a time there were three little sisters; and their names were
<a href="http://www.jb51.net" class="sister" id="link1">Elsie</a>,
<a href="http://www.jb51.net" class="sister" id="link2">Lacie</a> and
<a href="http://www.jb51.net" class="sister" id="link3">Tillie</a>;
and they lived at the bottom of a well.</p>
<p class="story">...</p>
"""
soup = BeautifulSoup(html_doc) 
print soup.title # 输出:<title>The Dormouse's story</title>
print soup.title.name # 输出:title
print soup.title.string # 输出: The Dormouse's story
print soup.p # 输出: <p class="title"><b>The Dormouse's story</b></p>
print soup.a # 输出:<a class="sister" href="http://www.jb51.net" id="link1">Elsie</a>
print soup.find_all('a') 
print soup.find(id='link3')
print soup.get_text()

soup 就是BeautifulSoup处理格式化后的字符串
soup.title得到的是title标签
soup.p 得到的是文档中的第一个p标签
soup.find_all(‘p’) 遍历树, 得到所有的标签’p’匹配结果
get_text() 是返回文本, 其实是可以获得标签的其他属性的,比如要获得a标签的href属性的值,可以使用 print soup.a['href'],类似的其他属性,比如class也可以这么得到: soup.a['class'])

用Beautifulsoup解析html文件, 就可以获得需要的网址\数据等文件. 下面这段代码是用来获取字段中的url链接的:

def findLinks(htmlString):"""搜索htmlString中所有的有效链接地址,方便下次继续使用htmlString = ‘<a href="http://example.com/lacie" class="sister" id="link2">Lacie</a>'类似的字符串"""linkPattern = re.compile("(?<=href=\").+?(?=\")|(?<=href=\').+?(?=\')")return linkPattern.findall(htmlString)

正则表达式

实际使用中,用Beautifulsoup应该可以处理绝大多数需求,但是如果需要对爬去下来的数据再进一步分析的话,就要用到正则表达式了.

大多数符号在正则表达式中都有特别的含义,所以要作为匹配模式的话,就必须要用\符号转义.例如搜索'/a', 对应的正则表达式是'/a'
[]代表匹配里面的字符中的任意一个
[^]代表除了内部包含的字符以外都能匹配,例如pattern1 = re.compile("[^p]at")#这代表除了p以外都匹配
正则表达式中()内的部分是通过匹配提取的字段.

基本用法,例如得到的url字符串后,需要截取最后一个/符号后的字段作为保存的文件名:

topic_url='http://usefulenglish.ru/phrases/bus-taxi-train-plane'
filename_pattern=re.compile('.*\/(.*)$')
filename = filename_pattern.findall(topic_url)[0]+'.txt'

得到:
filename = 'bus-taxi-train-plane.txt'

最后给出完整代码. 这段代码实现了对英文学习网站()中phrase栏目下日常口语短语的提取.代码的功能主要分为两部分:
1)解析侧边栏条目的url地址, 保存在url_list中
2)下载url_list中网页正文列表中的英文句子.
网站页面如下:

image.png
image.png
import requests
from bs4 import BeautifulSoup
import re
import os
import codecsdef findLinks(htmlString):"""搜索htmlString中所有的有效链接地址,方便下次继续使用"""linkPattern = re.compile("(?<=href=\").+?(?=\")|(?<=href=\').+?(?=\')")return linkPattern.findall(htmlString)def fetch_html(url_link):html = requests.get(url_link, headers={'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.80 Safari/537.36'}).contentreturn htmlDOWNLOAD_URL = 'http://usefulenglish.ru/phrases/'html = fetch_html(DOWNLOAD_URL)soup = BeautifulSoup(html, "lxml")side_soup = soup.find('div', attrs={'id': 'sidebar'})url_pattern = re.compile('^[\<a]')
start = 0
url_list = []
for items in side_soup.find_all('li'):if url_pattern.findall(str(items)):url = findLinks(str(items))if url == []:start = start + 1continueelse:if start == 1:url_list.append(url[0])else:continuefilename_pattern=re.compile('.*\/(.*)')for topic_url in url_list[5]:html = []soup = []page_soup = []
#    topic_url = 'http://usefulenglish.ru/phrases/time'print(topic_url)html = fetch_html(topic_url)
#    print(html)soup = BeautifulSoup(html)page_soup = soup.find('div', attrs={'class':'body'})
#    print(page_soup)filename = filename_pattern.findall(topic_url)[0]+'.txt'
#    print(filename)if not os.path.exists(filename):os.system('touch %s' % filename)outfile = codecs.open(filename, 'wb', encoding='utf-8')ftext = []pattern = re.compile('^[a-zA-Z]')for table_div in page_soup.find_all('p'):text = table_div.getText()if pattern.findall(text):line = re.sub('\(.*\)|\?|\.|\/|\,','', text)ftext.append(line)with codecs.open(filename, 'wb', encoding='utf-8') as fp:fp.write('{ftext}\n'.format(ftext='\n'.join(ftext)))

附录: 正则表达式



参考:
使用request爬:https://zhuanlan.zhihu.com/p/20410446
爬豆瓣电影top250(网页列表中的数据):
https://xlzd.me/2015/12/16/python-crawler-03
Beautifulsoup使用方法详解: http://www.jb51.net/article/43572.htm
Beautifulsoup官网文档: https://www.crummy.com/software/BeautifulSoup/bs4/doc/
http://www.169it.com/article/9913111281939258943.html
Python正则表达式:
http://www.runoob.com/python/python-reg-expressions.html
http://www.cnblogs.com/huxi/archive/2010/07/04/1771073.html


http://chatgpt.dhexx.cn/article/OuFvu8iq.shtml

相关文章

可视化数据分析-基于JavaScript的d3实践学习

目录 一.svg简介 二.D3简介 D3功能来源 常用语法说明 三.d3可视化访问MySQL数据库 实现方法 四.具体用例实现 svg绘制直方图 svg绘制二叉树&#xff08;以电影票房为例&#xff09; D3进行数据可视化&#xff08;链接数据库&#xff09; D3绘制直方图​ D3绘制饼图…

Kindle产品评论数据分析---基于excel的分析过程

目录 业务背景 一&#xff09;明确分析目的 二&#xff09;数据采集 三&#xff09;数据清洗 四&#xff09;数据分析与构建模型 1、相关产品的评论数排名和平均评分反映的问题 2、各评论占比&#xff0c;推荐评论中好评占比 3、kindle相关产品随时间变化其评论数的变化…

数据挖掘HeartbeatClassification——数据分析

如同计算机视觉中一样&#xff0c;在训练目标识别的网络之前&#xff0c;会对图片进行预处理&#xff0c;如 裁切&#xff0c;旋转、放大缩小&#xff0c;以加强网络的泛化能力。在数据挖掘中&#xff0c;我们首先要做的就是对拥有的数据进行分析( 涉及到《概率论与数理分析》的…

javaScript数据可视化

文章目录 canvas画布介绍绘制线段起始点设置其他点设置&#xff08;可以有多个&#xff09;划线方法 属性填充线段颜色线段宽度线段例子 绘制矩形第一种方式&#xff1a;第二种方式矩形例子 绘制圆形圆形例子 清除画布清除例子 绘制文字属性 svg介绍&#xff1a;基本的svg元素例…

Python交互式数据分析报告框架:Dash

译者序 原文于2017年6月21日发布&#xff0c;时过半载&#xff0c;将这篇既不是教程&#xff0c;也不是新闻的产品发布稿做了一番翻译&#xff0c;为何&#xff1f;只因去年下半年的时候&#xff0c;用R语言的博哥和龙少有Shiny这样的框架可以开发交互式整合Web数据分析报告&am…

【数据可视化】免费开源BI工具 DataEase 之血缘关系分析

近期&#xff0c;DataEase 发布的版本 V1.8 版本中&#xff0c;在系统管理模块新增了血缘分析功能&#xff0c;可以支持对数据源、数据集、仪表板做关联分析&#xff0c;支持按表格查看和按关系图查看&#xff0c;并且在删除数据源、数据集时&#xff0c;也支持查看对应的血缘分…

数据分析与数据可视化的完成,需要了解一下这四款JS库

四款出色的JavaScript库&#xff0c;帮助大家更为轻松地完成数据分析与可视化工作&#xff0c;具体如下&#xff1a; Data-Driven-Documents (D3.js) 在讨论JavaScript数据分析时忽略掉Data-Driven-Documents (D3)&#xff0c;就如同在谈论微软时忽略掉其操作系统 样。 Data-D…

数据挖掘之关联分析(实验展示以及源代码)

数据挖掘之关联分析 算法实现&#xff1a;Apriori算法和FP-growth 算法源代码 简单描述下&#xff0c;关联分析概念 关联分析概念主要参考下面的博文 原文&#xff1a;https://blog.csdn.net/qq_40587575/article/details/81022350 关联分析是从大量数据中发现项集之间有趣的…

【数据分析入门】python数据分析-探索性数据分析之多因子与对比分析可视化

文章目录 多因子与对比分析可视化理论基础假设检验与方差检验假设检验方差检验 相关系数:皮尔逊、斯皮尔曼回归:线性回归PCA与奇异值分解 代码实践交叉分析分组分析相关分析因子分析 总结代码实现 相关性线性回归PCA注意&#xff1a;sklearn中pca用的方法是奇异值分解的方法&am…

数据分析系列之挖掘建模

经过数据探索与数据预处理,得到了可以直接建模的数据,根据挖掘目标和数据形式可以建立分类与预测,聚类分析,关联规则,时序模式和偏差检测等模型,帮助企业提取数据中的商业价值. 分类与预测 对于之前的背景假设,餐饮企业会经常遇到如下问题: 如何基于菜品历史销售情况,以及节…

【大数据分析与挖掘】挖掘建模之关联分析

文章目录 一、关联规则1.1 常用的关联规则算法1.2 Apriori算法介绍1.2.1 关联规则与频繁项集1.2.2 Apriori算法的思想与性质1.2.3 Apriori算法的实现的两个过程1.2.4 Apriori算法的实现案例 一、关联规则 关联规则分析也成为购物篮分析&#xff0c;最早是为了发现超市销售数据…

Hands-on-data-analysis 动手数据分析

动手数据分析笔记 第一章 第一节 数据载入及初步观察 数据载入 df pd.read_csv(file_path)df2 pd.read_table(file_path)read_csv 函数 见CSDN 博客&#xff1a; https://blog.csdn.net/weixin_39175124/article/details/79434022 问&#xff1a;read_csv 和 read_table …

python数据分析-因子分析(转载)

python数据分析-因子分析&#xff08;转载&#xff09; &#xff08;获取更多知识&#xff0c;前往前往我的wx ————公z号 &#xff08;程式解说&#xff09; 原文来自python数据分析-因子分析

ThreeJs 数据可视化学习扫盲

一&#xff1a;前言 数据可视化是一个跨领域的行业&#xff0c;其中包含了图形学、数学、视觉传达等专业领域。 下图罗列出了一个简单的学习方向。 二&#xff1a;可视化方案以及学习路线 目前采用的是比较成熟&#xff0c;社区活跃度更高的Three.js&#xff0c;它是一个开源…

数据处理以及Hive数据分析

数据处理以及Hive数据分析 一、pandas进行数据预处理【1】待处理的一部分数据【2】原始数据文件的格式说明【3】数据预处理要求【4】 处理完成的数据字段说明【5】 实验方法使用pandas进行数据预处理 【6】解析题意【7】代码展示&#xff08;1&#xff09;读取文件&#xff08;…

Python交互式数据分析报告框架~Dash介绍

原文作者&#xff1a;Plotly,Chris Pamer 原文链接&#xff1a; https://link.jianshu.com/?thttps%3A%2F%2Fmedium.com%2F%40plotlygraphs%2Fintroducing-dash-5ecf7191b503 译者序&#xff1a;原文于2017年6月21日发布&#xff0c;时过半载&#xff0c;将这篇既不是教程…

CESI: Canonicalizing Open Knowledge Bases using Embeddings and Side Information

开放性知识库的规范化&#xff08;个人理解&#xff1a;这里的规范化实际上就是将相同语义的实体或关系聚集在一起&#xff0c;从而表示一个实体或关系&#xff09;&#xff0c;主要是OPENie提取的过程中没有进行区分&#xff0c;最近的研究发现&#xff0c;开放KBS的规范化实际…

计算机一级仿宋gb2312,仿宋gb2312字体

一般情况下&#xff0c;这款软件在试用的过程可能还有点小问题&#xff0c;但是正所谓瑕不掩瑜&#xff0c;相信用不了多久&#xff0c;只要程序猿给力点&#xff0c;这种小小的反馈不爽就可以解决。 仿宋gb2312字体字体简介 仿宋_GB2312字体是印刷字体的一种 &#xff0c;仿照…

Supervisor部署(离线部署需要提前下载部署包)

1.软件准备 下载tar包&#xff1a;wget https://pypi.python.org/packages/source/s/supervisor/supervisor-3.1.3.tar.gz 解压&#xff1a;tar -xvf supervisor-3.1.3.tar.gz 进入解压包&#xff1a;cd supervisor-3.1.3 开始安装&#xff1a;python setup.py install 下载me…

Docker 学习之 Docker 容器数据卷

容器数据卷 什么是容器数据卷 docker 理念回顾 将应用和环境打包成一个镜像&#xff01; 问题&#xff1a;数据&#xff1f;如果数据都在容器中&#xff0c;那么我们删除容器&#xff0c;数据就会丢失&#xff01;需求&#xff1a;数据可以持久化&#xff01; 容器之前可以…