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