今天正好爬蟲實驗需要用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創建的名字
結果
不過,什麼都會也沒用,世界本就不公,只能努力堅持變得更強,總有一天會得到回報。