python 爬蟲框架 scrapy 學習筆記

scrapy project  xxxx
scrapy genspider xxxxx "http://www.xx.com"

編寫items.py        明確要提取的數據
編寫spiders/xxx.py        編寫爬蟲文件處理請求和響應
編寫pipelines.py        編寫管道文件,處理spider返回item數據
編寫settings.py        啓用管道組建,以及其他相關設置

執行爬蟲

hr.tencent.com

創建spider模板
scrapy genspider tencent "tencent.com"

執行爬蟲命令
scrapy crawl tencent

++++++++++++++++++++++++++++++++++


scrapy startproject Douyu
scrapy genspider douyu "douyucdn.cn"

item.py

nickname=scrapy.Field()
imagelink=scrapy.Field()

douyucdn.cn

baseUrl="http://capi.douyucdn.cn/api/v1/getVerticalRoom?limit=20&offset="
offset=0
start_urls=[baseUrl+str(offset)]

spider.py

def parse(self,response):
    data=json.loads(response.body)
    #print(data)
    if len(data)==0:
        return
    for dat in data:
        print(dat["nickname"])
        print(dat["avatar_mid"])
        item=DouyuItem()
        item['nickname']=dat['nickname']
        item['avatar_mid']=dat['avatar_mid']
        yield item
    
    self.offset+=20
    yield scrapy.Request(self.baseUrl+str(self.offset),callback=self.parse)

pipline

ImagesPipeline

def get_media_requests(self,item,info):
    image_link=item['imagelink']
    yield scrapy.Request(image_link)
def process_item(self,item,spider):
    return item

def item_complete(self,results,item,info):
    #print(relust)
    #print(***)
    image_path=[x["path"] for ok ,x in resluts if ok]
    os.rename(images_store+image_path[0],images_store+item["nickname"]+".jpg")
    
    return item
    
    
setting.py

IMAGES_STORE=""


Mozilla/5.0 (Linux; U; Android 8.1.0; zh-cn; BLA-AL00 Build/HUAWEIBLA-AL00) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/57.0.2987.132 MQQBrowser/8.9 Mobile Safari/537.36
Mozilla/5.0 (iPhone; U; CPU iPhone OS 2_0 like Mac OSX; en-us) AppleWebKit/525.18.1(KHTML,like Gecko) Version/3.1.1Mobile/5A347 Safari/525.200

TOBOTSTXT_OBEY=False    

path=[x["path"] for ok,x in resluts if ok]


cd douyue
scrapy crawl Douyu

 


scrapy 筆記

安裝 scrapy 

pip install scrapy
pip install pypiwin32

1、針對於文本檢索的TF-IDF算法
2、針對於鏈接傳遞權重的鏈接算法:Pagerank
3、針對於鏈接再計算的:HITS算法
4、針對於鏈接相關度的:Hilltop算法
5、讓鏈接計算更加靈活的:SALSA算法
6、更加完善的Pagerank算法
7、基於用戶點擊行爲的結果性排序

import scrapy
from qsbk.items import QsbkItem
class QsbkSpiderSpider(scrapy.Spider):
    name='qsbk_spider'
    allowed_domains=['qiushibaike.com']
    start_urls=['https://www.qiushibaike.com/text/page/1']
    
    def parse(self,response):
        duanzidivs=response.xpth("//div[@id='content-left']/div")
        for duanzidiv in duanzidivs:
            author=duanzidiv.xpath(".//h2/text()").get().strip()
            content=duanzidiv.xpath(".//div[@class='content']//text()").getall()
            content="".join(content).strip()
            item=QsbkItem(author=author,content=content)
            #duanzi={"author":author,"content":content}
            yield item #duanzi


pipelines.py

import json
class QsbkPipeline(object):
    def __init__(self):
        self.fp=open("duanzi.join","w",encoding="utf-8")
    def open_spider(self,spider):
        print("爬蟲開始")
        pass
    def process_item(self,item,spider):
        item_json=json.dumps(item)
        item_json=json.dumps(dict(item),ensure_ascii=False)
        self.fp.write(item_json+'\n')
        return item
        
    def close_spider(self,spider):
        self.fp.close()
        print("爬蟲結束")

    
        
settings.py

打開註釋
ITEM_PIPELINES={
    'qsbk.pipelines.QsbkPipeline':300
}

items.py

import scrapy

class QsbkItem(scrapy.Item):
    author=scrapy.Field()
    content=scrapy.Field()

糗事百科爬蟲筆記

1.response 是一個scrapy.http.response.html.HtmlResponse 對象,可以用xpath 和 css來提取數據
2.提取出來的數據是一個Selector 或者是 SelectList對象,如果想要獲得其中的其中的字符串,那麼應該執行 getall 或者 get 方法。
3.getall 方法:獲取Selector 中的所有文本,返回的是一個列表
4.get 方法:獲取的是Selector 中的第一個文本,返回的是一個str類型
5.如果數據解析回來,要傳給pipline處理,那麼可以使用yield來返回,或者是收集所有的item最後統一用return 返回
6.item:建議在‘item.py’中定義好模型,以後就不用字典
7.pipline:這個是專門用來保存數據的。其中有三個方法是經常用的:
    open_spider(self,spider)
    process_item(self,item,spider)
    close_spider(slef,spider)
    要激活pipline,應該在‘settings.py’中,設置‘ITEM_PIPELINES’。
    ·····························································
    ITEM_PIPELINES={
        'qsbk.pipelines.QsbkPipeline':300
    }
    ·····························································

以json行的形式重寫管道

from scrapy.exporters import JsonLinesItemExporter

class QsbkPipeline(object):
    def __init__(self):
        self.fp=open("duanzi.json",'wb')
        self.exporter=JsonLinesItemExporter(self.fp,ensure_ascii=False,encoding='utf-8')
    def open_spider(self,spider):
        print("爬蟲開始。。。")
    def process_item(self,item,spider):
        self.exporter.export_item(item)
        return item
    def close_spider(self,spider):
        self.fp.close()
        print('爬蟲結束了。。。')

        
        
        
        
以json文件形式重寫管道    

from scrapy.exporters import JonsItemExporter

class QsbkPipeline(object):
    def __init__(self):
        self.fp=open("duanzi.json",'wb')
        self.exporter=JsonItemExporter(self.fp,ensure_ascii=False,encoding='utf-8')
        self.exporter.start_exporting()
        
    def open_spider(self,spider):
        print("爬蟲開始了")
    
    def process_item(self,item,spider):
        self.exporters.export_item(item)
        return item
    def close_spider(self,spider):
        self.exporter.finish_exporting()
        self.fp.close()
        print('爬蟲結束了....')
        
        
重寫 spider 使得蜘蛛能連續爬取下一頁的數據

················································
class qsbk_spider
name
start_urls
domain

def parse(self,response):
    //提取列表集合
    //遍歷每一項
    //提取要的數據
    //yield 返回
    //提取下一頁的鏈接 
    //如果有,就發起請求
    //如果沒有,結束蜘蛛
···················································
    
class QsbkSpiderSpider(scrapy.Spider):
    name='qsbk_spider'
    allowed_domains=['qiushibaike.com']
    start_urls=['https://www.qiushibaike.com/text/page/1/']
    base_domain="https://www.qiushibaike.com"
    
    def parse(self,response):
        duanzidivs=response.xpath("//div[@id='content-left']/div")
        for duanzidiv in duanzidivs:
            author=duanzidiv.xpath(".//h2/text()").get().strip()
            content=duanzidiv.xpath(".//div[@class='content']//text()").getall()
            content="".join(content).strip()
            item=QsbkItem(author=author,content=content)
            yield item
        next_url=response.xpath("//ul[@class='pagination']/li/[last()/a/@href]").get()
        if not next_url:
            return
        else yield scrapy.Request(self.base_domain+next_url,callback=slef.parse)


scrapy genspider -c crawl [爬蟲名字][域名]


##### CrawlSpider:
需要使用LinkExtractor和Rule.這兩個東西決定爬蟲的具體走向。
1. allow設置規則的方法:要能夠限制在我們想要的url上面。不要跟其他的ur1產生相同
的正則表達式即可。
2.什麼情況下使用follow:如果在爬取頁面的時候,需要將滿足當前條件的url再進行跟
進,那麼就設置爲True.否則設置爲Fasle.
3.什麼情況下該指定callback: 如果這個url對應的頁面,只是爲了獲取更多的url,並不
需要裏面的數據,那麼可以不指定callback.如果想要獲取url對應頁面中的數據,那麼就
需要指定一個callback.

非體址Scrapy Shell:
I
1.可以方便我們做一些數據提取的測試代碼。
2.如果想要執行scrapy命令,那麼毫無疑問,肯定是要先進入到scrapy所在的環境中。
3.如果想要讀取某個項目的配置信息,那麼應該先進入到這個項目中。再執行scrapy
shell"命令,|


數據存入mysql


class JianshuSpiderPipeline(object):
    def __init__:
        dbparam={
            'host':'127.0.0.1',
            'port':'3306',
            'user':'root',
            'password':'root',
            'database':'jianshu2'
            'charset':'utf-8'
        }
        self.conn=pymysql.connect(**dbparams)
        self.cursor=self.conn.cursor()
        self._sql=None
        
        def process_item(self,item,spider):
            self.cursor.execute(self.sql,(item['title'],item['content'],item['author']))
            self.conn.commit()
            return item
        @property
        def sql(self):
            if not self._sql:
                self.sql:="""
                insert into article(id,title,content) values(null,%s,%s,$s,$s)
                """
                return self._sql
                
            return self._sql


異步入口

class JianshuTwistedPipeline(object):
    def __init__(self):
        dbparam={
            'host':'',
            'port':'',
            'user':'',
            'password':'',
            'database':'',
            'charset':'utf8',
            'cursorclass':cursors.DictCursor
        }
        self.dbpool=adapi.ConnectionPool('pymysql',**dbparams)
        self._sql=None
        
        @property
        def sql(self):
            if not self._sql:
                self._sql="""
                insert into() values(null,%s,%s,%s,%s,%s)
                """
                return self._sql
            return self._sql
        def process_item(self,item,spider):
            defer=self.dbpool.runInteraction(self.insert_item,item)
            defer.addErrback(self.handle_error,item,spider)
        def insert_item(self,cursor,item):
            cursor.execute(self.sql,(item['title'],item['content'],item['author'],item['avatar']))
            
        def handle_error(self,error,item,spider):
            print('='*10+"error",item,spider):
            print(error)

start.py 

from scrapy import cmdline
cmdline.execute("scrapy craw swf".split())


到處python 虛擬環境的依賴

pip freeze > requirements.txt

rz 命令 可以打開本地文件上傳對話框

pip install -r requirements.txt

虛擬環境安裝

pip install virtualenvwrapper

which python3

mkvirtualenv -p /usr/bin/python3 crawler -env
        
http://capi.douyucdn.cn/api/v1/getVerticalRoom?limit=20&offset=100
https://www.bilibili.com/video/av57909837/?p=2


 

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