目录
1. 建立 Web 网站
2. 编写 Scrapy 爬虫程序
为了说明 scrapy 爬虫爬取网站多个网页数据的过程,用 Flask 搭建一个小型的 Web 网站。
(1)books.html
books
计算机
(2)databse.html
database
数据库
Home
(3)program.html
program
程序设计
Home
(4)network.html
network
计算机网络
Home
(5)mysql.html
mysql
MySQL数据库
Home
(6)python.html
python
Python程序设计
Home
(7)java.html
java
Java程序设计
Home
【问题】编写一个爬虫程序爬取这个网站所有的页面的标题文字。
服务器程序 server.py 如下:
import flask
import os
app = 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("/")
def process(section):
data = ""
if section != "":
data = getFile(section)
return data
if __name__ == "__main__":
app.run()
仍然使用4.1节中的爬虫程序项目,重新编写MySpider.py程序
爬虫程序 MySpider.py 如下:
import scrapy
class 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())
获取网页中的
标题的文本,这就是要爬取的数据,为了简单起见这个数据只有一项;
(5)
links=selector.xpath("//a/@href").extract()
获取所有的链接的 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程序的要求。