scrapy基础用法
本次爬虫用来爬取http://www.xbiquge.la中的小说
scrapy startproject biquge(项目名) 创建一个爬虫项目
目录结构:
./biquge/
|____ scrapy.cfg 用以记录当前项目的基础设置,settings的位置,,调度,项目名等
|____ biquge
|____ __init__.py 必须有
|____ items.py 写存储字段
|____ middlewares.py
|____ pipelines.py 管道文件
|____ settings.py 爬虫设置文件
|____ spiders
|____ __init__.py
Scrapy中启用IP:https://blog.csdn.net/qq_34798152/article/details/79944682
./biquge/biquge/settings.py字段:
BOT_NMAE:爬虫名
SPIDER_MOUDLES(NEWSPIDER_MOUDLE):爬虫位置
ROBOTSTXT_OBEY:是否遵循网站的robots.txt协议
DOWNLOAD_DELAY:爬虫延时
CONCURRENT_REQUESTS:爬虫并发量(默认为16)
CONCURRENT_REQUESTS_PER_DOMAIN:如果目标域名较少,会提供并发请求数目的进一步限制
CONCURRENT_REQUESTS_PER_IP:如果设置了本属性,CURRENT_REQUESTS_PER_DOMAIN会被忽略,这时的限制会是针对IP的。
可把CONCURRENT_REQUESTS_PER_IP保持为默认值(0),金庸对每个IP的限制,再将CONCURRENT_REQUESTS+PER_DOMAIN设置为一个很大的值(10000)。这样设置实际上就仅用了这些限制,这样下载器的并发请求数目就只有CONCURRENT_REQUESTS来控制。
COOKIES_ENABLED:是否启用Cookie
TELNETCONSOLE_ENABLED:是否禁用Telent控制台
DEFAULT_REQUEST_HEADERS:默认请求标头
SPIDER_MIDDLEWARES:spider中间件设置
DOWNLOADER_MIDDLEWARES:下载器中间件设置
EXTENSIONS:扩展程序设置
ITEM_PIPELINES:项目管道设置
AUTOTHROTTLE_ENABLED:AutoThrottle扩展
AUTOTHROTTLE_START_DELAY:初始下载延迟
AUTOTHROTTLE_MAX_DELAY:高延迟情况下设置的最大延迟
更详细字段:https://blog.csdn.net/u011781521/article/details/70188171
在./biquge/biquge/items.py中写需要爬取的字段结构(这里只演示获取title与对应URL):
1 import scrapy 2 3 class UrlItem(scrapy.Item): 4 title = scrapy.Field() 5 url = scrapy.Field()
./biquge目录下,scrapy genspider Scrn "www.xbiquge.la" 创建一个名为"Scrn"的爬虫,指定爬取范围为www.xbiquge.la
./biquge/biquge/spiders
|____ __init__.py
|____ Scrn.py 写爬虫逻辑的主要文件
./biquge/biquge/spiders/Scrn.py中字段:
1 import scrapy 2 from biquge.items import UrlItem #引入存储字段结构的Item类 3 4 class ScrnSpider(scrapy.Spider): 5 name = 'Scrn' #爬虫名,再命令行用scrapy crawl 爬虫名来执行爬虫 6 allowed_domains = ['http://www.xbiquge.la'] #爬虫的活动域 7 start_urls = ['http://www.xbiquge.la/10/10489/'] #爬虫的起始网址,一般为想要爬取的网页地址 8 9 def parse(self,response): #默认的爬虫解析函数 10 for each in response.xpath("//div[@id='list']/dl/dd"): #使用xpath解析获取需要的字段 11 item = UrlItem() 12 item['title'] = each.xpath("./a/text()").extract_first() #将解析的字段存入item 13 item['url'] = each.xpath("./a/@href").extract_first() 14 15 yield item #将item抛出给管道文件处理(Pipelines.py),需要在settings文件中设置
在./biquge/biquge/pipelines.py中编写处理item的逻辑:
1 import json 2 3 class UrlPipeline(object): 4 def __init__(self): 5 self.filename = open("Url.json","wb") #在初始化函数中打开存储数据的文件 6 def process_item(self, item, spider): #用于接收并处理item的方法 7 jsontext = json.dumps(dict(item),ensure_ascii=False)+"\n" #将传入的item用字典加载,再转为json,ensure_ascii=False用于输出中文 8 self.filename.write(jsontext.encode("utf-8")) #将转为json的字段写入文件 9 return item 10 def close_spider(self,spider): #关闭爬虫时执行 11 self.filename.close() #关闭文件
在./biquge/biquge/settings.py中启用管道文件:
1 ITEM_PIPELINES = { 2 'biquge.pipelines.UrlPipeline': 300, 3 }
总体来讲:
./biquge/biquge/items.py文件中定义字段结构
./biquge/biquge/pipelines.py文件中编写存储逻辑
./biquge/biquge/spiders/Scrn.py文件中编写爬取逻辑,并存储到item中,再抛出(from biquge.items import UrlItem)
./biquge/biquge/settings.py文件中设置Scrn.py与pipelines.py文件的连接(item)