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

       目录

1. 建立 Web 网站

2. 编写 Scrapy 爬虫程序


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

1. 建立 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()

2. 编写 Scrapy 爬虫程序

        仍然使用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程序的要求。

你可能感兴趣的:(爬虫,scrapy,python,开发语言,flask)