scrapy框架的使用

今天正好爬蟲實驗需要用scrapy框架簡單爬一個網站的所有新聞信息

在這裏插入圖片描述
在這裏插入圖片描述

講一下實現

本來很久之前就想寫一個講scrapy框架使用的博客,但是平時寫的爬蟲都不太需要用到框架,所以也就一直擱下來,正好今天講一下。
首先兩個最重要的命令:
1.創建scrapy爬蟲項目:scrapy startproject +名字
2.創建spider:scrapy genspider +名字

然後就會建立一個下面這樣的目錄結構
在這裏插入圖片描述

1.編寫items

簡單解釋就是Scrapy.Field()這個域就可以定義我們想要返回的字典類型中的對應的值

import scrapy


class BdracenewsItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    title=scrapy.Field()
    text=scrapy.Field()
    time=scrapy.Field()

在這裏插入圖片描述

2.編寫pipelines

實現把得到的數據保存到csv和mysql

import pandas as pd
from sqlalchemy import create_engine


class BdracenewsPipeline(object):
    def __init__(self):
        self.engine=create_engine('mysql+pymysql://root:[email protected]:3306/爬蟲數據')

    def process_item(self, item, spider):
        data=pd.DataFrame(dict(item))
        data.to_sql('Bdnews_data',self.engine,if_exists='append',index=False)
        data.to_csv("./Bdnews_data.csv",mode='a+',index=False,sep='|',header=False)

3.編寫爬蟲

這是最重要的一步,之前做的所有都建立在我們編寫的爬蟲能爬取到我們所需要的數據。
在這裏插入圖片描述
這是需要爬取的頁面,我們要先確定爬蟲思路

  • 1.爬取所有的頁面裏面的所有的新聞鏈接
  • 2.解析每一個新聞頁面中的標題,內容,時間信息
    在這裏插入圖片描述
    觀察到了每個網頁的url規律,自己構建url,爲了偷懶也不去網頁中提取尾頁頁數了,直接定爲16
    def parse(self, response):
        last_page_num=16
        append_urls=['http://www.tipdm.org/notices/index_%d.jhtml'%i for i in range(1,last_page_num+1)]
        for url in append_urls:
            yield Request(url,callback=self.parse_url,dont_filter=True)

然後得到的所有頁面的鏈接,再去得到每條新聞的鏈接
在這裏插入圖片描述
href後面跟着的就是每條新聞詳情頁面的鏈接,所以我們就遍歷所有頁面然後把這些鏈接都解析出來,最後把提取的鏈接加上host得到實際url

    def parse_url(self,response):
        urls=response.xpath("//div[@class='tit']/a/@href").extract()
        for page_url in urls:
            text_url='http://www.tipdm.org'+page_url
            yield Request(text_url,callback=self.parse_text,dont_filter=True)

xpath的使用可以自己去百度,這裏就不講太多了,多用幾次其實xpath很簡單的
最後提取每個新聞詳情頁中的標題,內容,時間
在這裏插入圖片描述
在這裏插入圖片描述
內容是所有p標籤
在這裏插入圖片描述
by the way,檢查自己寫的xpath對不對很簡單,f12,選擇elements,然後ctrl+F
在這裏插入圖片描述
把自己寫的輸進去,如果找得到會提示的
在這裏插入圖片描述
這是爬蟲部分的代碼

# -*- coding: utf-8 -*-
import scrapy
from scrapy.http import Request
from ..items import BdracenewsItem

class BdraceSpider(scrapy.Spider):
    name = 'bdrace'
    allowed_domains = ['www.tipdm.org']
    start_urls = ['http://www.tipdm.org/']

    def parse(self, response):
        last_page_num=16
        append_urls=['http://www.tipdm.org/notices/index_%d.jhtml'%i for i in range(1,last_page_num+1)]
        for url in append_urls:
            yield Request(url,callback=self.parse_url,dont_filter=True)


    def parse_url(self,response):
        urls=response.xpath("//div[@class='tit']/a/@href").extract()
        for page_url in urls:
            text_url='http://www.tipdm.org'+page_url
            yield Request(text_url,callback=self.parse_text,dont_filter=True)

    def parse_text(self,response):
        item=BdracenewsItem()
        item['title']=response.xpath("//div[@class='contentCom']/h1/text()").extract()
        text=response.xpath("//div[@class='conTxt']//p/text()").extract()
        texts=""
        for string in text:
            texts=texts+string+"\n"
        item['text']=[texts.strip()]
        item['time']=response.xpath("//div[@class='artInfo']/span[1]/text()").extract()
        yield item

4.編寫settings

這一步就比較簡單了,需要使用的模板去掉註釋,然後改成自己想要的就行。
這部分就不貼代碼了,把上面要求的幾個地方改一下就行

5.運行爬蟲

scrapy crawl +name
這裏的name就是你genspider創建的名字
在這裏插入圖片描述

結果

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
不過,什麼都會也沒用,世界本就不公,只能努力堅持變得更強,總有一天會得到回報。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章