【爬虫】4.4 Scrapy 爬取网站数据

news/2025/2/11 22:11:30/

       目录

1. 建立 Web 网站

2. 编写 Scrapy 爬虫程序


        为了说明 scrapy 爬虫爬取网站多个网页数据的过程,用 Flask 搭建一个小型的 Web 网站。

1. 建立 Web 网站

(1)books.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>books</title>
</head>
<body><h3>计算机</h3><ul><li><a href="database.html">数据库</a></li><li><a href="program.html">程序设计</a></li><li><a href="network.html">计算机网络</a></li></ul>
</body>
</html>

(2)databse.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>database</title>
</head>
<body><h3>数据库</h3><ul><li><a href="mysql.html">MySQL数据库</a></li></ul><a href="books.html">Home</a>
</body>
</html>

(3)program.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>program</title>
</head>
<body><h3>程序设计</h3><ul><li><a href="python.html">Python程序设计</a></li><li><a href="java.html">Java程序设计</a></li></ul><a href="books.html">Home</a>
</body>
</html>

(4)network.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>network</title>
</head>
<body><h3>计算机网络</h3><a href="books.html">Home</a>
</body>
</html>

(5)mysql.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>mysql</title>
</head>
<body><h3>MySQL数据库</h3><a href="books.html">Home</a>
</body>
</html>

(6)python.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>python</title>
</head>
<body><h3>Python程序设计</h3><a href="books.html">Home</a>
</body>
</html>

(7)java.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>java</title>
</head>
<body><h3>Java程序设计</h3><a href="books.html">Home</a>
</body>
</html>

        【问题】编写一个爬虫程序爬取这个网站所有的页面的<h3>标题文字。

服务器程序 server.py 如下:

import flask
import osapp = flask.Flask(__name__)def getFile(fileName):data = b""fileName = "web_html/" + fileName  # 将7个html页面放到web_html目录下,做了个路径拼接if os.path.exists(fileName):fobj = open(fileName, "rb")data = fobj.read()fobj.close()return data@app.route("/")
def index():return getFile("books.html")@app.route("/<section>")
def process(section):data = ""if section != "":data = getFile(section)return dataif __name__ == "__main__":app.run()

2. 编写 Scrapy 爬虫程序

        仍然使用4.1节中的爬虫程序项目,重新编写MySpider.py程序

爬虫程序 MySpider.py 如下:

import scrapyclass MySpider(scrapy.Spider):name = "mySpider"def start_requests(self):url = 'http://127.0.0.1:5000'yield scrapy.Request(url=url, callback=self.parse)# 函数start_requests可以用start_urls替换# start_urls = ['http://127.0.0.1:5000']def parse(self, response, **kwargs):try:print(response.url)data = response.body.decode()selector = scrapy.Selector(text=data)print(selector.xpath("//h3/text()").extract_first())links = selector.xpath("//a/@href").extract()for link in links:url = response.urljoin(link)yield scrapy.Request(url=url, callback=self.parse)except Exception as err:print(err)

开启 服务器server.py

执行run.py如下:

http://127.0.0.1:5000
计算机
http://127.0.0.1:5000/network.html
计算机网络
http://127.0.0.1:5000/program.html
程序设计
http://127.0.0.1:5000/database.html
数据库
http://127.0.0.1:5000/mysql.html
MySQL数据库
http://127.0.0.1:5000/java.html
Java程序设计
http://127.0.0.1:5000/books.html
计算机
http://127.0.0.1:5000/python.html
Python程序设计

        scrapy 自动筛选已经访问过的网站,我们来分析程序的执行过程:

(1)    

start_urls=['http://127.0.0.1:5000']

这是入口地址,访问这个地址成功后会回调parse函数;

(2)    

def parse(self, response):

这是回调函数,该函数的response对象包含了网站返回的信息;

(3)    

data=response.body.decode()          

selector=scrapy.Selector(text=data)

网站返回的response.body的二进制数据,要decode转为文本,然后建立Selector对象;

(4)

print(selector.xpath("//h3/text()").extract_first())

获取网页中的<h3>标题的文本,这就是要爬取的数据,为了简单起见这个数据只有一项;

(5)

links=selector.xpath("//a/@href").extract()

获取所有的<a href=...>链接的 href值,组成links列表;

(6)

for link in links:            

        url=response.urljoin(link)              

         yield scrapy.Request(url=url,callback=self.parse)

访问links的每个link,通过urljoin函数与response.url地址组合成完整的 url地址,再次建立Request对象,回调函数仍然为parse,即这个parse函数会被递归调用。其中使用了yield语句返回每个Request对象,这是 scrapy程序的要求。


http://www.ppmy.cn/news/351033.html

相关文章

TO:松下深圳售后服务部

深圳市新一新电器服务有限公司维修人员叶先生技术差&#xff0c;服务态度差&#xff0c;冷藏室内结冰一星期&#xff0c;竟无需检测凭眼瞄看后下结论冰箱结冰正常&#xff0c;我以以往使用时结霜状况及现在结冰状况对比描述症状所在&#xff0c;叶姓维修人员竟叫我自行将冰箱拉…

关于松下A6伺服的再生电阻问题

再生电阻是指当伺服电机由发电机模式驱动时&#xff0c;电力回归至伺服放大器侧。 当伺服电机由发电机模式驱动时&#xff0c;电力回归至伺服放大器侧&#xff0c;这被称为再生电力。再生电力通过在伺服放大器的平滑电容器的充电来吸收。 超出可以充电的能量后&#xff0c;再用…

专访松下 | 20多年养老经验,日本养老标杆落地中国的经验与挑战

前言 也许没多少人知道&#xff0c;松下不仅仅是家电行业的翘楚&#xff0c;在养老领域也有着深厚的积淀。 早在1998年&#xff0c;松下就开始在日本养老市场的探索&#xff0c;布局了包含适老化家居产品、护理设备与服务、养老院及日间照料中心等在内的多元产品及服务体系&a…

松下电子的成长

呵呵&#xff0c;深圳有一个很好的惠民工程就是移动的图书馆&#xff0c;在我们小区就有这样的一个我很喜欢的图书馆&#xff0c;办了一张卡&#xff0c;全是智能办理&#xff0c;智能借书&#xff0c;还有就是你需要看得书可以订单&#xff0c;过几天就可以借阅了&#xff0c;…

关于松下的一点历史

松下幸之助先生的个人经历和松下幸之助的最初历史 松下电器工业株式会社&#xff08;后来成为松下公司&#xff09;的创始人松下幸之助&#xff08;Konosuke Matsushita&#xff09;有着非凡的个人经历&#xff0c;塑造了公司的最初历史。松下幸之助于1894年11月27日出生于日本…

路径规划算法:基于供需优化的路径规划算法- 附代码

路径规划算法&#xff1a;基于供需优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于供需优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能优化算法供需…

使用漫步者wt800蓝牙耳机连接谷歌浏览器,自动关机

chrome浏览器 输入: chrome://flags/#hardware-media-key-handling 把Hardware Media Key Handling设置成disable ,重启浏览器.解决.

漫步者W800bt,无线蓝牙链接电脑 用浏览器看视频 自动关机

漫步者W800bt&#xff0c;无线蓝牙链接电脑 用浏览器看视频 自动关机 原因是谷歌浏览器新增的音量调节界面插件的问题&#xff0c;解决方法&#xff1a; 进这个网址设置 chrome://flags/#hardware-media-key-handling 里面Hardware Media Key Handling 改成disabled&#xff0…