1. 程式人生 > >Scrapy爬蟲實戰二:獲取天氣資訊

Scrapy爬蟲實戰二:獲取天氣資訊

本文專案採用python3.6版本語言,利用scrapy框架進行爬取。

該專案實現的功能是爬取某城市的天氣以及往後預報一週的天氣,並將爬取到的資訊儲存為.txt檔案和寫入mysql資料庫。利用scrapy爬蟲就像是做填空題,

只需要在相應的檔案裡填入相應的內容,連檔名都不用該。下面是本次專案的目錄結構:

----weather

----weather

----spiders

__init__.py

wuhanSpider.py

__init__.py

items.py

pipelines.py

settings.py

scrapy.cfg


上述目錄結構中,沒有後綴名的為資料夾,有後綴的為檔案。我們需要修改只有wuhanSpider.py、items.py、pipelines.py、settings.py這四個檔案。

其中items.py決定爬取哪些專案,wuhanSpider.py決定怎麼爬,setting.py決定由誰去處理爬取的內容,pipelines決定爬取後內容怎樣處理,這裡的

pipelines是將爬取的資訊儲存在.txt檔案中,後面還會提供一個pipelines2mysql.py檔案,這個檔案是將資訊儲存到mysql資料庫中,小夥伴們可以用

pipelines2mysql檔案的內容直接替換pipeLines裡內容,也可以將兩個檔案放在一起,呼叫的時候改一下 名稱即可

1、選擇爬取的專案items.py

#決定爬取哪些專案

import scrapy

class WeatherItem(scrapy.Item):
    cityDate=scrapy.Field()
    week=scrapy.Field()
    img=scrapy.Field()
    temperature=scrapy.Field()
    weather=scrapy.Field()
    wind=scrapy.Field()
2、定義怎樣爬取wuhanSpider.py
#定義如何爬取
import scrapy
from weather.items import WeatherItem

class WuHanSpider(scrapy.Spider):
    name="wuHanSpider"
    allowed_domains=['tianqi.com']
    citys=['wuhan','shanghai']
    start_urls=[]
    for city in citys:
        start_urls.append('http://'+city+'.tianqi.com')

    def parse(self,response):
        subSelector=response.xpath('//div[@class="tqshow1"]')
        items=[]
        for sub in subSelector:
            item=WeatherItem()
            cityDates=''
            for cityDate in sub.xpath('./h3//text()').extract():
                cityDates+=cityDate
            item['cityDate']=cityDates
            item['week']=sub.xpath('./p//text()').extract()[0]
            item['img']=sub.xpath('./ul/li[1]/img/@src').extract()[0]
            temps=''
            for temp in sub.xpath('./ul/li[2]//text()').extract():
                temps+=temp
            item['temperature']=temps
            item['weather']=sub.xpath('./ul/li[3]//text()').extract()[0]
            item['wind']=sub.xpath('./ul/li[4]//text()').extract()[0]
            items.append(item)
        return items



這部分就是專案的核心了,本專案爬取的網站為 http://wuhan.tianqi.com/ ,採取的是xpath選擇器。經常我們需要爬取的資訊來自於多個url地址,這個時候

我們需要尋找url的規律,試驗可以發現上海的天氣url為:http://shanghai.tianqi.com/ ,本文只爬取了武漢和上海兩個地區的天氣,讀者也可以在上面citys

列表中多新增幾個城市。

開啟網頁原始碼,如下圖所示:


可以發現天氣資訊都在<div class="tqshow1">標籤下,讀者重點看下程式碼裡是如何一層一層的找到我們需要爬取的資訊的。

3.1、儲存爬取的結果為.txt檔案pipelines.py

#儲存爬取結果
import time
import os.path
from urllib import request

class WeatherPipeline(object):
    def process_item(self,item,spider):
        today=time.strftime('%Y-%m-%d',time.localtime())
        fileName=today+'.txt'	
        with open(fileName,'a') as fp:
            fp.write((item['cityDate']+'\t'))
            fp.write(item['week']+'\t')
            imgName=os.path.basename(item['img'])
            fp.write(imgName+'\t')
            if os.path.exists(imgName):
                pass
            else:
                with open(imgName,'wb') as fp:
                    response=request.urlopen(item['img'])
                    fp.write(response.read())
            fp.write(item['temperature']+'\t')
            fp.write(item['weather']+'\t')
            fp.write(item['wind']+'\t\n')
            time.sleep(1)
        return item
3.2、儲存爬取結果進mysql資料庫

本專案儲存進的mysql資料庫名scrapyDB,建表的程式碼如下:

create table weather(
	id  int auto_increment,
	cityDate char(24),
	week char(6),
	img char(20),
	temperature char(12),
	weather char(20),
	wind char(20),
	PRIMARY KEY(id)
);
pipelines2mysql.py程式碼為:
import pymysql
import os.path

class WeatherPipeline(object):
    def process_item(self,item,spider):
        cityDate=item['cityDate']
        week=item['week']
        img=os.path.basename(item['img'])
        temperature=item['temperature']
        weather=item['weather']
        wind=item['wind']

        conn=pymysql.connect(
            host='localhost',
            port=3306,
            user='root',
            passwd='yourPassword',
            db='scrapyDB',
            charset='utf8'
            )
        cur=conn.cursor()
        cur.execute("insert into weather(cityDate,week,img,temperature,weather,wind) values (%s,%s,%s,%s,%s,%s)",(cityDate,week,img,temperature,weather,wind))
        cur.close()
        conn.commit()
        conn.close()
        
        return item



4、分派任務的settings.py
BOT_NAME='weather'

SPIDER_MODULES=['weather.spiders']

NEWSPIDER_MODULE='weather.spiders'

ITEM_PIPELINES={'weather.pipelines.WeatherPipeline':1,
                'weather.pipelines2mysql.WeatherPipeline':2}

說明一下,ITEM_PIPELINES中的數字只是一個值,填多少都可以,數字越小越先被執行。

5、配置檔案scrapy.cfg

[settings]
default=weather.settings

[deploy]
project=weather
配置檔案裡的資訊說明專案名稱以及指定預設分配任務的檔案,另外專案裡的兩個__inti__.py檔案都是空檔案,保留這兩個檔案主要是為了讓他們所在

的資料夾可以作為python的模組使用。

6、怎麼執行

cmd->cd 將檔案調到我們專案所在的這一層檔案,也就是上面目錄結構中scrapy.cfg所在的這一層資料夾,然後輸入命令:scrapy crawl wuHanSpider

執行結束後,會在專案根目錄下產生“2017-06-01.txt”檔案,裡面儲存的就是近一週的天氣預報,也會下載下來相應天氣的圖片,同時也會儲存進mysql

的資料庫。這裡的wuHanSpider是我們WuHanSpider類中name="wuHanSpider"的值,更改name的值輸入的命令也將更改。

本部落格有參考《Python網路爬蟲實戰》一書,該書採用的是python2.x在Linux系統下執行的,採用python3.x在windows下執行的可以參考本部落格。



相關推薦

Scrapy爬蟲實戰獲取天氣資訊

本文專案採用python3.6版本語言,利用scrapy框架進行爬取。 該專案實現的功能是爬取某城市的天氣以及往後預報一週的天氣,並將爬取到的資訊儲存為.txt檔案和寫入mysql資料庫。利用scrapy爬蟲就像是做填空題, 只需要在相應的檔案裡填入相應的內容,連檔名都不用

2017.08.04 Python網絡爬蟲Scrapy爬蟲實戰 天氣預報

font size 項目 執行 weather html time art show 1.項目準備:網站地址:http://quanzhou.tianqi.com/ 2.創建編輯Scrapy爬蟲: scrapy startproject weather scrapy

2017.08.04 Python網絡爬蟲Scrapy爬蟲實戰 天氣預報的數據存儲問題

sql語句 city amd64 ces img href asp encoding primary 1.數據存儲到JSon:程序閱讀一般都是使用更方便的Json或者cvs等待格式,繼續講解Scrapy爬蟲的保存方式,也就是繼續對pipelines.py文件動手腳 (1)創

網路爬蟲Scrapy實戰爬取多個網頁

前面介紹的scrapy爬蟲只能爬取單個網頁。如果我們想爬取多個網頁。比如網上的小說該如何如何操作呢。比如下面的這樣的結構。是小說的第一篇。可以點選返回目錄還是下一頁 對應的網頁程式碼: 我們再看進入後面章節的網頁,可以看到增加了上一頁 對應的網頁程式碼 通過

爬蟲——Scrapy框架案例陽光問政平臺

web url地址 blog rem idt xpath disable ora ole 陽光熱線問政平臺 URL地址:http://wz.sun0769.com/index.php/question/questionType?type=4&page= 爬取字段:帖

Scrapy爬蟲實戰使用代理訪問

Scapy爬蟲實戰:使用代理訪問 Middleware 中介軟體設定代理 middlewares.py settings.py spider 配置meta使用proxy 快代理 前面我們簡單的設定了h

scrapy爬蟲實戰偽裝headers構造假IP騙過ip138.com

scrapy爬蟲實戰:偽裝headers構造假IP騙過ip138.com Middleware 中介軟體偽造Header Util.py middlewares.py settings.py ip138.py

Scrapy爬蟲實戰百度搜索找到自己

Scrapy爬蟲實戰:百度搜索找到自己 背景 分析 怎麼才算找到了自己 怎麼才能拿到百度搜索標題 怎麼爬取更多頁面 baidu_search.py 宣告BaiDuSearchItem Items

資料庫SQL實戰12獲取所有部門中當前員工薪水最高的相關資訊

思想: 題目要求獲取所有部門中當前員工薪水最高的相關資訊,給出dept_no, emp_no以及其對應的salary。首先通過條件d.to_date = '9999-01-01'找出所有部門當前員工,然後通過條件s.to_date = '9999-01-01'找出各員工當前

java爬蟲獲取天氣資訊併發送簡訊。

java爬蟲獲取天氣資訊併發送簡訊:   自己谷腦java獲取網頁資訊,想著順便傳送簡訊給自己實現一個天氣簡訊提醒的小玩意。可加入自己專案中,做個定時任務。完善這個小玩意。:   需要SMS平臺的註冊。獲取到key;可自己檢視SMS簡訊傳送平臺,噁心的就是  免費的只有5條簡

C#系統實戰(3)獲取提示資訊“不能為空”

當輸入的教師資訊不完整時,某些必填項沒有填,那麼將會出現提示“不能為空”,下面我們用自動化實現獲取這個文字資訊。用.text來獲取:text2=driver.find_element_by_id('ContentPlaceHolder1_RequiredFieldValida

Unity&Android之獲取手機電量資訊、網路狀況

Unity&Android之二:獲取手機電量資訊、網路狀況 遊戲中經常會在UI顯示電量以及網路狀況 手機電量包括: 1、當前正在充電還是放電 2、當前電量值 網路包括: 1、如果是WIFI,WIFI訊號強度 2、如果是流量,訊號強度等資料

Scrapy爬蟲----()專案實戰(上)

結合上一篇博文《Scrapy爬蟲—-(一)命令列工具》中講解的一些常用的命令我們可以很方便的建立一個Scrapy專案,這篇文章便可以開始我們的第一個Scrapy爬蟲專案:爬取一個簡單的靜態網頁中的

爬蟲任務爬取(用到htmlunit和jsoup)通過百度搜索引擎關鍵字搜取到的新聞標題和url,並保存在本地文件中(主體借鑒了網上的資料)

標題 code rgs aps snap one reader url 預處理 采用maven工程,免著到處找依賴jar包 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http:

爬蟲實戰2爬出頭條網美圖

open exists read 地址 bsp lose col new 頭條 完整代碼經測試可成功運行,目的是抓取頭條網輸入街拍後的圖片 有幾個問題點不明白 1. 查看頭信息,參數表和代碼中params有些不同,不知道代碼中的參數是怎麽來的 offset: 40

微信公眾號開發() -- 獲取使用者資訊 修改粉絲標籤

獲取code值 $appid=’’ // 微信支付申請對應的公眾號的APPID $urlCode=’’ // 處理code頁面 不能包含? 是微信可訪問頁面 $url="https://open.weixin.qq.com/connect/oauth2/authorize?appid="

SpringBoot 入門之獲取Properties中的值,通過類配置來替代原SpringXML的配值和注入方式

•application.properties •application.yml person.last-name=\u674E\u56DB person.age=12 person.birth=2017/12/15 person.boss=false person.maps.k

Scrapy爬蟲實戰 CrawlSpider和Item Loader的使用

網站: https://tech.china.com/articles/ 建立專案: scrapy startproject scrapyuniversal   之前建立專案,都用scrapy genspider +爬蟲名字+域名的方式,此次要建立CrawlSpider需要

Scrapy爬蟲實戰------360攝影美圖

網站: http://images.so.com/ 切換到攝影介面。 開啟開發者工具: 我們在下拉的時候可以看到這是一個ajax請求,資料結構是json。 sn=30返回的是前30張圖片,sn=60返回的是30到60的圖片。 建立專案: 構造請求:

python爬蟲入門()Requests的使用

雖然Python有內建的urllib庫,可以實現網路的請求,但是我並不推薦。因為urllib在很多時候使用起來不方便,比如加一個代理,處理Cookie時API都很繁瑣,再比如傳送一個POST請求也很麻煩。而Requests就相當於urllib的升級版本,簡